2017-04-09 69 views
-1

我有一个JButton的JDialog(截图中的右边框)。当我单击JButton时,我想更改另一个JFrame中的JPanel大小(截图中的左边框)。通过JButton更改JPanel大小

我的问题是,目前我的应用程序不会将JPanel的大小更改为新大小(20,20),当我单击按钮“单击我”时。当我点击按钮时,我的测试文本“Hello world”出现在控制台中。

实施例的屏幕截图:如果没有显示截图

备选链路:http://www.dachaufsetzer.net/files/images/other/java-question-1.jpg

这是我的代码:

Dialog.java(所述的JDialog)

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); 


    } 

} 

Gener ator.java(在Frame.java使用的JPanel)

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"); 
    } 
} 

Frame.java(JFrame中其使用Generator.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); 
    } 

}

主.java(主类)

public class Main { 

    public static void main(String[] args) { 

     Frame window = new Frame(); 
     Dialog d = new Dialog(); 

    }  
} 

感谢您的支持。

回答

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类:

你也做了同样的错误。您正在创建Dialog类构造函数中的另一个JDialog对象。另一个巨大的错误是,您正在将一个new Generator()作为动作侦听器添加到按钮中。要更改添加到FrameGenerator面板的大小,您需要获取该面板的引用并将其添加为ActionListener。这是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作为参数。该参数是您想要更改的面板。

然后在主类:

​​

当您使用new创建一个类的实例,这个实例都有它的属性是从同一类型的其他实例不同。在你的代码中,你创建了多个相同类型的实例,认为改变其中一个会改变另一个(我认为你实际上并不了解它们是两个单独的东西)。

+0

非常感谢您为Flood2d提供的巨大帮助。现在很清楚! – spiceflo

1

ActionListener代码中,您还需要在重置首选大小后调用revalidate()。这将调用布局管理器。您可能还需要在revalidate()之后调用repaint()

当然这只会改变面板的大小。对话框大小将保持不变。如果您希望调整大小,您可能还需要在对话框中调用pack()。您可以通过在ActionListener中使用SwingUtilities.windowForComponent(...)来获得对话框的引用。

+0

感谢camickr对你的支持,与你的反馈和Flood2d的反馈,它的工作原理 – spiceflo