Bir JToggleButton'una (özel arka planı vardır) sahip olması gereken birkaç JLabels içeren bir JPanel içermesi gerekir. Bu bölüm çalışıyor.JToggleButton'unu JPanel ile bir JTable hücresine yerleştirme
Bu düğme daha sonra bir JTable hücresine yerleştirilir ve kullanıcılar tarafından basılması amaçlanır. Sorun şu ki sadece ikinci tıklamadaki düğmeye basabiliyorum. İlk tıklamada, odak ilk olarak JLabels ile panele ve daha sonra da gerçek butona atlar.
Bu sorunu çözmek için birkaç şey denedim, ancak aynı sorun devam ediyor. A) JPanel'in etiketleri ile doğrudan JToggleButton # add() üzerine yerleştirilmesi. JToggleButton alır JLayeredPane farklı Katmanlar üzerine Düğme ve Jpanel yerleşimi için kullandığı B) kısıt (Tamsayı - böylece JLabels ile JPanel
Herhangi ipucu var mı üst
görünür kalır)? TeşekkürlerAşağıda, sorunu gösteren örnek kod yer almaktadır. Düğmeye tıklamak sadece ikinci kez çalışır. tablo ne olursa olsun bu bileşen fare olayları ele alamayacağını en derin bileşenine fare olayı geçen bir hücreyi seçmek için bir fare olayı yakalar
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);
}
}
doğrudan sorunla ilgili: editör uygulaması _invalid_ olduğu: Düzenlemelerin iç nedenlerle işine zaman onun dinleyicileri bildirmek _must_. Probleminize gelince: temel olarak a) düzenlemenin ilk tıklamayla başlatıldığından emin olunuz b) tıkladığınızda, bileşen koordinatlarını düzenleme sırasındaki konumunu hesaplayın ve düzenleme üzerindeki "gerçek" hedef bileşenine (fi düğmesi) gönderin panel – kleopatra
BTW: Table_Model uygulamanızın da balıkçılığınız olduğu gibi masaüstünüzdeki bileşenleri koruyabilirsiniz. (düzenlenebilir olmakla birlikte hücre değerlerini değiştirmek için herhangi bir api eksikse), belki de biraz değil-çok-önemsiz şeyler ortasında sağ atlama önce masa temelleri :-) – kleopatra
Kleopatra, ipuçlarını için teşekkürler. Belki de a) düzenlemenin ilk tıklamada başlatıldığından emin olmanızı sağlayabilir misiniz? B) bu tıklamayı yakalayın, bileşen koordinatlarını düzenleme sırasındaki konumunu hesaplayın ve düzenleme panelindeki "gerçek" hedef bileşenine gönderiniz. olayı gerçek hedefe göndererek kastettiğinize emin olduğunuzda, ne demek istediğinizi call doClick().eğer öyleyse, korkarım jToggleButton'un sağladığı tıklama animasyonunu kaybederim. – d56