私は非常に単純なプログラムを作成しています。このクラスを作成しました: MainJframeClass、JDesktopPaneClass、JinternalFrameClass1、および JinternalFrameClass2。jdesktoppaneclass をインスタンス化し、desktoppane1 という名前を付けて、それを MainJframeclass に追加しました。また、2 つの jinternalframes をインスタンス化し、internal1 と internal2 という名前を付けました。これで、mainjframeclass にボタンがあり、押すと internal1 が desktoppane1 に追加されます。私の問題は、internal1のどこかに配置されたボタンを使用して、internal2をdesktoppane1に追加する方法です。デスクトップペイン1に別のボタンを追加して、内部2を追加するだけでよい理由はわかっています。しかし、私はすでにそれを行っています。この問題を解決したいだけです。私を助けてください。ところで私の英語でごめんなさい。
2756 次
2 に答える
3
それは単に参照の問題です。JDesktopPaneに何かを追加するコードには、その参照が必要です。そのため、コンストラクターパラメーターまたはメソッドパラメーターのいずれかを介して、その参照を必要とするクラスに渡す必要があります。
編集1
例:
import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
public class ReferenceExample extends JPanel {
private JDesktopPane desktop = new JDesktopPane();
private Random random = new Random();
public ReferenceExample() {
JButton addInternalFrameBtn = new JButton("Add Internal Frame");
addInternalFrameBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
addInternalFrame();
}
});
JPanel btnPanel = new JPanel();
btnPanel.add(addInternalFrameBtn);
setPreferredSize(new Dimension(600, 450));
setLayout(new BorderLayout());
add(new JScrollPane(desktop), BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}
public void addInternalFrame() {
MyInternalFrame intFrame = new MyInternalFrame(ReferenceExample.this);
int x = random.nextInt(getWidth() - intFrame.getPreferredSize().width);
int y = random.nextInt(getHeight() - intFrame.getPreferredSize().height);
intFrame.setLocation(x, y);
desktop.add(intFrame);
intFrame.setVisible(true);
}
private static void createAndShowUI() {
JFrame frame = new JFrame("Reference Eg");
frame.getContentPane().add(new ReferenceExample());
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
class MyInternalFrame extends JInternalFrame {
// pass in the reference in the constructor
public MyInternalFrame(final ReferenceExample refEg) {
setPreferredSize(new Dimension(200, 200));
setClosable(true);
JButton addInternalFrameBtn = new JButton("Add Internal Frame");
addInternalFrameBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// use the reference here
refEg.addInternalFrame();
}
});
JPanel panel = new JPanel();
panel.add(addInternalFrameBtn);
getContentPane().add(panel);
pack();
}
}
于 2011-07-29T01:49:25.563 に答える
1
internal1 のどこかに配置されたボタンを使用して、internal2 を desktoppane1 に追加する方法。
ボタンに追加された ActionListener では、次のようなコードを使用して、デスクトップ ペインへの参照を取得できます。
Container container = SwingUtilities.getAncestorOfClass(JDesktopPane.class, (Component)event.getSource());
if (container != null)
{
JDesktopPane desktop = (JDesktopPane)container;
JInternalFrame frame = new JInternalFrame(...);
desktop.add( frame );
}
于 2011-07-29T02:27:50.773 に答える