我有一个带JButton的JDialog(屏幕截图中右框)。当我单击JButton时,我想在另一个JFrame中更改JPanel的大小(截图中的左侧框)。
我的问题是,目前我的应用程序没有将JPanel的大小更改为新的大小(20,20),当我点击按钮"点击我"。我的测试文本" Hello world"单击按钮时出现在控制台中。
示例屏幕截图:
如果未显示屏幕截图,则为替代链接:http://www.dachaufsetzer.net/files/images/other/java-question-1.jpg
这是我的代码:
Dialog.java (JDialog)
Observable<[Object]> -> [Observable<Object>] -> Observable<[Object]>
Generator.java (在Frame.java中使用的JPanel)
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Dialog extends JDialog implements ActionListener{
public Dialog(){
JDialog d = new JDialog();
d.setSize(300, 300);
JButton b = new JButton("click me");
b.addActionListener(new Generator());
d.add(b);
d.setVisible(true);
}
}
Frame.java (使用Generator.java的JFrame)
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Generator extends JPanel implements ActionListener{
int width;
int height;
public Generator(){
}
public Generator(int w, int h){
this.width = w;
this.height = h;
super.setBackground(Color.red);
super.setPreferredSize(new Dimension(this.width, this.height));
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval(0, 0, 50, 50);
}
@Override
public void actionPerformed(ActionEvent e) {
super.setPreferredSize(new Dimension(20, 20));
System.out.println("Hello world");
}
}
}
Main.java (主要类)
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class Frame extends JFrame {
public Frame(){
JFrame f = new JFrame();
f.setSize(400, 400);
Generator g = new Generator(2000, 2000);
JScrollPane scrollPane = new JScrollPane(g);
scrollPane.setPreferredSize(new Dimension(300,300));
f.add(scrollPane);
f.setVisible(true);
}
感谢您的支持。
答案 0 :(得分:1)
在ActionListener
代码中,您还需要在重置首选大小后调用revalidate()
。这将调用布局管理器。
您可能还需要在repaint()
之后调用revalidate()
。
当然这只会改变面板尺寸。对话框大小将保持不变。如果要调整对话框,可能还需要在对话框中调用pack()
。您可以使用ActionListener中的SwingUtilities.windowForComponent(...)
来获取对话框的引用。
答案 1 :(得分:0)
你正在做一些没有意义的事情。
关于Frame
班级:
在Frame
类中,您正在构造函数中创建另一个JFrame对象,使Frame
类无用。您还需要保存添加到Frame ScrollPane的Generator
面板的引用,以便从Dialog
更改其大小。这是带有更改的Frame
类:
import java.awt.*;
import java.awt.event.ActionEvent;
import javax.swing.*;
public class Frame extends JFrame {
public Generator g;
public Frame(){
setSize(400, 400);
g = new Generator(2000, 2000);
JScrollPane scrollPane = new JScrollPane(g);
scrollPane.setPreferredSize(new Dimension(300,300));
add(scrollPane);
setVisible(true);
}
}
关于Dialog
班级:
你犯了同样的错误。您正在JDialog
类构造函数中创建另一个Dialog
对象。另一个重大错误是您正在为按钮添加new Generator()
作为动作侦听器。要更改添加到Generator
的{{1}}面板的大小,您需要获取该面板的引用并将其添加为ActionListener。这是带有更改的Frame
类:
Dialog
如您所见,现在import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class Dialog extends JDialog implements ActionListener{
public Dialog(Generator g){
setSize(300, 300);
JButton b = new JButton("click me");
b.addActionListener(g);
add(b);
setVisible(true);
}
}
构造函数已将Dialog
作为参数。此参数是您要更改的面板。
然后在你的主课程中:
Generator
使用public class Main {
public static void main(String[] args) {
Frame window = new Frame();
//Here you send to Dialog constructor the panel you add to the Frame
Dialog d = new Dialog(window.g);
}
}
创建类的实例时,此实例的属性与同类型的其他实例不同。在您的代码中,您创建了多个相同类型的实例,认为更改其中一个将改变另一个(我认为您实际上并不了解它们是两个独立的事物)。