setFize for JFrame无法正常工作

时间:2015-12-10 10:44:07

标签: java swing jframe

我在以下Q& As中做了什么,但没有一个对我有用。

只想将JFrame的大小调整为设定的大小,但似乎无法弄清楚如何。阅读一些文档,但我仍然遗漏了一些东西,希望这里有人可以帮助我。谢谢。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;


public class CAUnit8Ch18 extends JFrame{

  private JTextField txtfield; 
  private JLabel label;   

  public CAUnit8Ch18() {

        setTitle("Color Change Frame"); 
        //setSize(900,500); this does not seem to work
        setPreferredSize(new Dimension(500,300));
        pack();
        setVisible(true); 
        setDefaultCloseOperation(EXIT_ON_CLOSE); 
        createContents(); 
  } 


  private void createContents() {

    JPanel jp = new JPanel();
    label = new JLabel("What is your name:");
    txtfield = new JTextField(20);

    jp.setOpaque(false); 
    Container contentPane = getContentPane();
    Random rand = new Random(); 
    int n = rand.nextInt(4);


    switch(n){
    case 0:
        contentPane.setBackground(Color.RED);
        label.setForeground(Color.WHITE);
        break;
    case 1:
        contentPane.setBackground(Color.WHITE);
        break;
    case 2:
        contentPane.setBackground(Color.YELLOW);
        break;
    case 3:
        contentPane.setBackground(Color.GREEN);
        label.setForeground(Color.BLUE);
        break;
    case 4:
        contentPane.setBackground(Color.BLUE);
        label.setForeground(Color.WHITE);
        break;
    }

    jp.add(label); 
    jp.add(txtfield); 

    txtfield.addActionListener(new Listener());
    add(jp); 


  } 


  private class Listener implements ActionListener {
    public void actionPerformed(ActionEvent e) {
      String message = "Thanks for playing, " + txtfield.getText();

      txtfield.setVisible(false); 
      label.setText(message); 
    } 
  } 

  public static void main(String[] args) {

    JOptionPane.showMessageDialog(null,
            "The following window color will be randomly chosen from\nRed, White, Yellow, Green, Blue");

    new CAUnit7Ch17();
  } 

}

3 个答案:

答案 0 :(得分:1)

好吧,你正在使用frame.setSize()和frame.pack()。你应该一次使用其中一个。

使用setSize()可以给出所需的帧大小,但如果使用pack(),它将根据其中组件的大小自动更改帧的大小。它不会考虑你之前提到的尺寸。

尝试从代码中删除frame.pack()或在设置大小之前将其放置,然后运行它。

答案 1 :(得分:1)

致电setSize而不是setPreferredSizepack - 这是一个顶级容器。更好的是,使用适当的布局管理器来处理框架的内容,然后只需调用pack,它将为您计算尺寸。

此外,只有在添加组件后才应调用setVisible

答案 2 :(得分:0)

感谢大家的回复。我通过在添加框架的所有内容之后放置setVisible(true)来解决问题。我正在设置setVisible然后添加面板和按钮,当我应该做的是先添加所有内容然后将setVisible设置为true。