【问题标题】:setSize for JFrame not workingJFrame 的 setSize 不起作用
【发布时间】:2016-03-15 23:11:40
【问题描述】:

我做了以下问答中的内容,但没有一个对我有用。

只想将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();
  } 

}

【问题讨论】:

  • 那些货号什么也没告诉我们。
  • “只是想将 JFrame 调整为设定的大小” 鉴于框架 'chrome' 在不同的外观和感觉上会有不同的大小,这意味着内容的大小窗格必须更改以适应固定大小的框架!通常最好的方法是指定内容的首选大小,使用布局填充和空白边框,然后pack() 框架,不用担心它的确切大小!
  • BTW - 你知道这个类的main(..) 方法没有创建CAUnit8Ch18 类的实例吗?先解决这个问题.. ;)

标签: java swing jframe


【解决方案1】:

好吧,您同时使用了 frame.setSize() 和 frame.pack()。您应该一次使用其中之一。

使用 setSize() 你可以给你想要的框架大小,但是如果你使用 pack(),它会根据其中组件的大小自动改变框架的大小。它不会考虑你前面提到的大小。

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

【讨论】:

  • 在 setSize() 之前移动 pack() 但不要删除它!调用 pack()(帧)或 validate()(小程序)对于 GUI 的正确布局是必要的。或者更好的是,向框架添加一些内容,以便布局管理器可以计算出打包后应该有多大(并删除任何设置大小、首选大小、最大或(甚至可能)最小大小的调用)
  • 或 setResizable(false);这将阻止 pack() 和用户调整 JFrame 的大小。
  • 这是错误的。再次查看给定的代码并自己尝试您的解决方案。
【解决方案2】:

调用setSize 而不是setPreferredSizepack - 这是一个顶级容器。更好的是,为框架的内容使用适当的布局管理器,然后调用pack,它会为您计算大小。

另外,setVisible 只能在添加组件后调用。

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 这就是我在回答中告诉你的。您应该接受我的答案(绿色复选标记),而不是发布您自己的答案。
    猜你喜欢
    • 2012-03-21
    • 2013-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-12
    • 2016-04-07
    相关资源
    最近更新 更多