下面是最小的可重現代碼。在帶有 mouseevent 的 MouseClicked 方法中,我知道使用 getelementat() 方法單擊了 Jpanel。但是無法確定點擊 JPanel 上的哪個按鈕。嘗試使用轉換點但犯了一些錯誤。需要檢查 Jpanel 上的哪個按鈕被點擊。需要一些幫助。
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class JListTest {
private JList list;
private DefaultListModel dataModel ;
private JTableTest tableTest;
private JPanel panel = new JPanel();
public JListTest() {
dataModel = new DefaultListModel();
list = new JList<>(dataModel);
list.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent me) {
super.mouseClicked(me);
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JList target = (JList) me.getSource();
int index = target.locationToIndex(me.getPoint());
JPanel item = (JPanel) target.getModel().getElementAt(index);
Point p=SwingUtilities.convertPoint(target,me.getPoint(),item);
item.getComponentAt(p);
}
});
}
});
list.setCellRenderer(new PanelRenderer());
}
public static void main(String []args){
JListTest test=new JListTest();
test.dataModel.addElement("Lable 1");
test.dataModel.addElement("Lable 2");
test.dataModel.addElement("Lable 3");
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
test.panel.add(button1);
test.panel.add(button2);
test.dataModel.addElement(test.panel);
test.showUi();
}
public void showUi(){
JFrame.setDefaultLookAndFeelDecorated(true);
JFrame frame = new JFrame("Demo list");
frame.setAlwaysOnTop(true);
frame.setType(Window.Type.UTILITY);
frame.setResizable(true);
frame.getContentPane().setLayout(new BorderLayout());
JScrollPane scrollPane = new JScrollPane(list);
scrollPane.setPreferredSize(new Dimension(400, 250));
frame.getContentPane().add(scrollPane, BorderLayout.NORTH);
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
frame.setSize(500, 300);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
class PanelRenderer implements ListCellRenderer {
public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
if(value instanceof String){
return new DefaultListCellRenderer().getListCellRendererComponent(list,value,index,isSelected,cellHasFocus);
}
return (Component) value;
}
}
}
塊參考
uj5u.com熱心網友回復:
item.getComponentAt(p);
那句話的意義何在?由于您從未將方法的結果分配給變數,因此您如何判斷代碼是否有效?
事實證明,因為面板并不是真正顯示在框架上的組件,所以你不能像我最初建議的那樣做。
如果您添加如下代碼:
JPanel item = (JPanel) target.getModel().getElementAt(index);
System.out.println( item.getBounds() );
你會得到如下輸出:
java.awt.Rectangle[x=-487,y=-36,width=0,height=0]
這沒有任何意義。
因此,我更改了將邊界分配給面板的邏輯,就好像它顯示在 JList 上一樣:
item.setBounds(target.getCellBounds(index, index));
現在,我得到如下輸出:
java.awt.Rectangle[x=0,y=54,width=487,height=36]
這確實更有意義。但是,這仍然無濟于事,因為如果您添加:
Point p = SwingUtilities.convertPoint(target,me.getPoint(),item);
System.out.println( p );
你會得到類似的東西:
java.awt.Point[x=834,y=166]
點的轉換確實符合我的預期。
所以,我決定手動轉換點:
int y = me.getY() - item.getBounds().y;
Point p = new Point(me.getX(), y);
把它們放在一起,你會得到類似的東西:
JList target = (JList) me.getSource();
int index = target.locationToIndex(me.getPoint());
JPanel item = (JPanel) target.getModel().getElementAt(index);
item.setBounds(target.getCellBounds(index, index));
int y = me.getY() - item.getBounds().y;
Point p = new Point(me.getX(), y);
JButton button = (JButton)item.getComponentAt(p);
System.out.println(button.getText());
當你點擊它時,你會得到按鈕的文本。
當然,如果您單擊其他任何地方,您會得到例外。我將由您來處理例外邏輯。
請注意,我看到您的最新問題是關于在框架中添加標簽和面板。這是使用真實組件的更好方法,因為您可以將 ActionListeners 添加到按鈕中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511844.html
標籤:爪哇摇摆
