Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

Java Swing에서 JTree의 리프 노드를 비활성화하는 방법

JTree는 데이터를 계층적(hierarchical) 구조로 보여주는 스윙(Swing) 컴포넌트입니다. 사용자는 개별 하위 트리(sub-tree)를 직접 확장하거나 축소할 수 있습니다.

JTree의 각 노드는 TreeNode 인터페이스에 정의된 메서드들을 반드시 구현해야 하며, 이 인터페이스의 기본 구현체가 바로 DefaultMutableTreeNode 클래스입니다.

JTree의 리프(leaf) 노드를 비활성화하려면 DefaultTreeCellRenderer 클래스의 getTreeCellRendererComponent() 메서드를 오버라이딩하여 처리할 수 있습니다.

메서드 시그니처

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel,
    boolean expanded, boolean leaf, int row, boolean hasFocus)

구현 예제

아래 예제에서는 커스텀 렌더러를 만들어 모든 노드의 선택 상태와 포커스를 해제하고, 컴포넌트 자체를 비활성화(enabled = false) 상태로 설정했습니다.

import java.awt.*;
import javax.swing.tree.*;
import javax.swing.*;

public class JTreeLeafNodeDisableTest extends JFrame {
   private TreeNode treeNode;
   private JTree tree;

   public JTreeLeafNodeDisableTest() {
      setTitle("JTreeLeafNodeDisable Test");
      treeNode = new DefaultMutableTreeNode("Country");
      tree = new JTree();
      tree.setModel(new DefaultTreeModel(treeNode));
      tree.setCellRenderer(new CustomDefaultTreeCellRenderer());
      add(tree);
      setSize(400, 300);
      setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      setLocationRelativeTo(null);
      setVisible(true);
   }

   public static void main(String[] args) {
      new JTreeLeafNodeDisableTest();
   }

   static class CustomDefaultTreeCellRenderer extends DefaultTreeCellRenderer {
      @Override
      public Component getTreeCellRendererComponent(JTree tree, Object value,
            boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
         boolean enabled = false;
         sel = enabled;
         hasFocus = enabled;
         Component treeCellRendererComponent = super.getTreeCellRendererComponent(
               tree, value, sel, expanded, leaf, row, hasFocus);
         treeCellRendererComponent.setEnabled(enabled);
         return treeCellRendererComponent;
      }
   }
}

실행 결과

프로그램을 실행하면 "Country"라는 루트 노드를 가진 트리가 표시되며, 노드들이 회색으로 표시되어 선택이나 편집이 불가능한 비활성화 상태임을 확인할 수 있습니다.

Java Swing에서 JTree의 리프 노드를 비활성화하는 방법

핵심 정리

  • DefaultTreeCellRenderer를 상속받아 커스텀 셀 렌더러를 작성합니다.
  • getTreeCellRendererComponent() 메서드 내에서 setEnabled(false)를 호출하면 해당 노드가 비활성화됩니다.
  • 선택(sel)과 포커스(hasFocus) 파라미터를 false로 전달하면 선택 효과도 함께 제거할 수 있습니다.
  • 특정 조건(예: 리프 노드만)에 따라 활성화 여부를 다르게 설정하고 싶다면 leaf 파라미터 값을 활용하면 됩니다.