2013-10-17 2 views
0

모든 것을 시도했지만 JTable 헤더 안에 JButton을 가져올 수 없습니다. 내가 거기에 표시하고 마우스 수신기를 사용하여 클릭을 트래킹 할 수 있었지만 시각적 인 클릭 효과는 없습니다. 누군가가 이것을하는 올바른 방법으로 간단한 예제를 제공 할 수 있습니까?클릭 효과가있는 JTable 헤더 안에 JButton을 만드는 방법은 무엇입니까?

+1

JTableHeader에이 편집기에만 렌더러를 지원하지 않습니다, 렌더러는 그림 만 환상이 아니라 실제 JComponent의,,, JTableHeader에있는 JCheckBox에 여기 아무것도 페인트하는 방법에 대해 뭔가를 해결할 수 없는지 확인 검색 시뮬레이션 JButton.isPressed/isArmed/isSelected – mKorbel

+0

이 [예제] (http://stackoverflow.com/a/7137801/230513) 변경 내용을 나타내는 텍스트를 변경합니다. – trashgod

답변

0

이런 식으로 사용해보세요. 이 코드는 JToggleButton과 함께 시각 효과를 제공합니다. 기본적으로

enter image description here

import java.awt.Component; 
import java.awt.event.MouseAdapter; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 

import javax.swing.*; 
import javax.swing.table.JTableHeader; 
import javax.swing.table.TableCellRenderer; 
import javax.swing.table.TableColumn; 
import javax.swing.table.TableColumnModel; 

public class Test { 
    private static JTable table; 

    public static void main(String[] args) { 
     table = new JTable(new Object[][]{{1,2},{2,3}},new Object[] 
       {"test", "test2"}); 

     TableColumn column = table.getColumnModel().getColumn(0); 
     column.setHeaderRenderer(new BtnRenderer(column.getHeaderValue())); 

     column = table.getColumnModel().getColumn(1); 
     column.setHeaderRenderer(new BtnRenderer(column.getHeaderValue())); 
     table.getTableHeader().addMouseListener(getHeaderMouseListener()); 
     JFrame f = new JFrame(); 
     f.add(new JScrollPane(table)); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     f.setVisible(true); 
    } 

    private static MouseListener getHeaderMouseListener() { 
     return new MouseAdapter() { 
      @Override 
      public void mousePressed(MouseEvent arg0) { 
       if(arg0.getButton() == 1){ 
        int columnAtPoint = 
          table.columnAtPoint(arg0.getPoint()); 
        /* Get the header portion of the table, and its column model */ 
        JTableHeader header = table.getTableHeader(); 
        TableColumnModel columnModel = header.getColumnModel(); 

        TableColumn column = columnModel.getColumn(columnAtPoint); 
        BtnRenderer headerRenderer = 
          (BtnRenderer) column.getHeaderRenderer(); 
        headerRenderer.actionPerformed(); 
       } else { 
        super.mousePressed(arg0); 
       } 
      } 
     }; 
    } 
} 

class BtnRenderer implements TableCellRenderer { 

    private JToggleButton btn; 

    public BtnRenderer(Object headerValue) { 
     btn = new JToggleButton(); 
     btn.addActionListener(System.out::println); 
     btn.setText(headerValue.toString()); 
    } 

    @Override 
    public Component getTableCellRendererComponent(
      JTable arg0, 
      Object arg1, 
      boolean arg2, 
      boolean arg3, 
      int arg4, 
      int arg5) { 
     return btn; 
    } 

    public void actionPerformed() { 
     btn.setSelected(!btn.isSelected()); 
    } 
} 
관련 문제