我需要一個JToggleButton(它具有自定義背景),它包含一個JPanel和幾個JLabel。該部分起作用。將JToggleButton和JPanel放在一個JTable單元格中
此按鈕被放置在一個JTable單元中,並被用戶按下。問題是我只能按第二次點擊按鈕。第一次單擊焦點時首先用JLabels跳到面板,然後再跳到實際的按鈕。
我嘗試了幾件事來嘗試解決這個問題,但同樣的問題依然存在。 A)將帶有標籤的JPanel直接放到JToggleButton#add()上。 B)使用JLayeredPane將Button和JPanel放置到不同的圖層上,其中JToggleButton採用約束整數( - ),使帶有JLabels的JPanel保持可見頂部
您有任何提示嗎?謝謝
下面是說明問題的示例代碼。點擊該按鈕只能再次使用。
public class ClickableCustomButtonInTable extends JToggleButton {
public ClickableCustomButtonInTable() {
Dimension d = new Dimension(100, 100);
JLabel lFirst = new JLabel("1st label");
lFirst.setPreferredSize(d);
JLabel lSecond = new JLabel("2nd label");
lSecond.setPreferredSize(d);
JPanel panel = new JPanel();
panel.setOpaque(true);
panel.setLayout(new BorderLayout());
panel.add(lFirst, BorderLayout.NORTH);
panel.add(lSecond, BorderLayout.SOUTH);
add(panel);
addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked");
}
});
}
private static class CustomButtonRenderer implements TableCellRenderer {
private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();
@Override
public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row,
int column) {
return button;
}
}
private static class CustomButtonEditor extends AbstractCellEditor
implements TableCellEditor {
private final ClickableCustomButtonInTable button = new ClickableCustomButtonInTable();
@Override
public Object getCellEditorValue() {
return button.getText();
}
@Override
public Component getTableCellEditorComponent(JTable table,
Object value, boolean isSelected, int row, int column) {
return button;
}
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setSize(new Dimension(200, 200));
Container content = frame.getContentPane();
TableModel model = new AbstractTableModel() {
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return null;
}
@Override
public int getRowCount() {
return 1;
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
return true;
}
@Override
public Class<?> getColumnClass(int columnIndex) {
return ClickableCustomButtonInTable.class;
}
};
JTable table = new JTable(model);
// table.setBounds(new Rectangle(0, 0, content.getWidth(), content
// .getHeight()));
table.setRowHeight(frame.getHeight());
table.setDefaultRenderer(ClickableCustomButtonInTable.class,
new CustomButtonRenderer());
table.setDefaultEditor(ClickableCustomButtonInTable.class,
new CustomButtonEditor());
content.add(table);
content.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
不直接關係到你的問題:編輯器實現_invalid_:當編輯終止內部原因,_must_通知其聽衆。至於你的問題:基本上你必須a)確保在第一次點擊時開始編輯b)抓住該點擊,在編輯組件座標中計算它的位置,並在編輯時調度到「真實」目標組件(fi按鈕)面板 – kleopatra 2012-03-12 09:15:01
順便說一句:你永遠不會在你的tableModel中保留組件...因爲你的TableModel實現也很腥(它宣佈它是可編輯的,但缺少任何改變單元格值的API),也許你應該閱讀並理解一些桌面基礎知識,然後在不太平凡的東西中間跳躍:-) – kleopatra 2012-03-12 09:18:31
@kleopatra,感謝您的提示。你可能會鏈接/顯示如何:a)確保編輯在第一次點擊時開始b)抓住該點擊,在編輯組件座標中計算它的位置並在編輯面板上發送到「真實」目標組件 我不是確定你將事件分派給真正的目標是什麼意思,它是doClick()調用你的意思。如果是這樣,恐怕我會失去jToggleButton提供的點擊動畫。 – d56 2012-03-12 09:25:49