【问题标题】:What should I use instead of FlowLayout()?我应该使用什么来代替 FlowLayout()?
【发布时间】:2013-07-22 20:31:09
【问题描述】:

所以,由于FlowLayout(),我的JFrame 并没有达到我想要的效果,但我不知道还有什么可以解决这个问题。它只会让我的JButton 填满整个JFrame。有没有办法让FlowLayout()JFrame 组件应用我的自定义尺寸和位置,或者是否有替代方案可以轻松替换它?

这是我的代码:

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

public class MTGSAMPServerReference extends JFrame implements ActionListener {

    public static Toolkit tk = Toolkit.getDefaultToolkit();
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth());
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight());

    private static final long serialVersionUID = 1L;
    private static JList list1;
    private static JButton next;

    public MTGSAMPServerReference() {
        // set flow layout for the frame
        this.getContentPane().setLayout(new FlowLayout());
        Object[] data1 = { "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" };
        list1 = new JList<Object>(data1);
        next = new JButton("Next");
        next.addActionListener(this);
        // add list to frame
        add(list1);
        add(next);
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Next")) {
            int index = list1.getSelectedIndex();
            System.out.println("Index Selected: " + index);
            String s = (String) list1.getSelectedValue();
            System.out.println("Value Selected: " + s);
        }
    }
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame f = new MTGSAMPServerReference();
        //Display the window.
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setSize(1200, 800);
        f.setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        next.setSize(75, 25);
        next.setLocation(251, 276);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        createAndShowGUI();
        }
        });
    }
}

有什么想法吗?

提前致谢!

编辑:这是问题的图片。

编辑:这是我希望它看起来的样子(大约):

【问题讨论】:

  • “它只会让我的 JButton 填满整个 JFrame” 不在这里它没有。提供 GUI 的 ASCII 艺术,因为它应该以最小的尺寸出现,并且(如果可调整大小)具有额外的宽度/高度。此外,请在源代码顶部包含导入,并在发布之前修复任何编译器警告。我有一个版本的代码可以做到这一点。你想让我把它编辑成问题吗?
  • 或者只是张贴图片或链接。
  • @AndrewThompson 现在做什么?我应该截个图看看它的样子吗?
  • “现在做什么?” 我有一个包含导入和修复警告的代码版本! “我应该只截一张它的样子吗?”我认为这不会有太大帮助,因为我的结果与你的不同。
  • 忘记确切的位置。粗略地勾勒出您希望组件的位置和方式,我们可以使用布局管理器帮助您完成。这并不意味着居中,除非您愿意。

标签: java swing jframe flowlayout contentpane


【解决方案1】:

此示例将按钮放在列表下方,并使用滚动窗格为列表添加边框。 GUI 中的“空白”部分由布局构造函数中定义的间距(例如列表和按钮之间的空间)提供,部分由使用EmptyBorder 提供。

然后将控制面板(使用BorderLayout)放在另一个FlowLayout 内。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.*;

public class MTGSAMPServerReference extends JFrame implements ActionListener {

    public static Toolkit tk = Toolkit.getDefaultToolkit();
    static int ScrnWidth = ((int) tk.getScreenSize().getWidth());
    static int ScrnHeight = ((int) tk.getScreenSize().getHeight());

    private static final long serialVersionUID = 1L;
    private static JList list1;
    private static JButton next;

    public MTGSAMPServerReference() {
        // set flow layout for the frame
        this.getContentPane().setLayout(new FlowLayout(FlowLayout.LEADING));
        Object[] data1 = { "Value 1", "Value 2", "Value 3", "Value 4", "Value 5" };

        JPanel controls = new JPanel( new BorderLayout(5,5) );

        list1 = new JList<Object>(data1);
        list1.setVisibleRowCount(5);
        next = new JButton("Next");
        next.addActionListener(this);
        // add list to frame
        controls.add(new JScrollPane(list1));
        controls.add(next, BorderLayout.PAGE_END);
        // adjust numbers as needed.
        controls.setBorder(new EmptyBorder(25,25,0,0));

        add(controls);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Next")) {
            int index = list1.getSelectedIndex();
            System.out.println("Index Selected: " + index);
            String s = (String) list1.getSelectedValue();
            System.out.println("Value Selected: " + s);
        }
    }

    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame f = new MTGSAMPServerReference();
        //Display the window.
        f.pack();
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.setSize(1200, 800);
        f.setLocationRelativeTo(null);
        list1.setSize(250, 250);
        list1.setLocation(0, 0);
        next.setSize(75, 25);
        next.setLocation(251, 276);
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {
        createAndShowGUI();
        }
        });
    }
}

【讨论】:

  • 所以,这允许自定义FlowLayout(),对吗?我看到它可以移动组件/
  • 运行它,然后使用 BorderLayoutEmptyBorder 构造函数中的数字。 ..然后阅读每个构造函数的 JavaDocs。
  • 很抱歉有时不理解,我仍在努力学习和完善我的技能。
  • 由于某种原因,JPanel controls = new JPanel( new BorderLayout(5,5) ); 行出现错误,有什么想法吗?
  • 编译器错误应该:1) 在单独的问题上被问到 2) 包括我们重现它所需的代码(SSCCE) 3) 包括准确的、复制/粘贴的消息文本。
【解决方案2】:

如果您想完全控制组件的放置位置,并让setBounds 工作,您需要删除布局管理器。这可以通过将布局管理器设置为null 来完成。不过,这不是一个好主意,你最好只使用布局管理器而不使用setBounds,因为你不受特定窗口大小和默认组件大小的限制,以及看起来不错的组件一种外观和感觉上的特定尺寸在另一种外观上可能不好看。

【讨论】:

  • 我想要完全控制,但不想做任何不好的做法。我正在学习并想知道做到这一点的最佳方法。
  • 这两个要求相互冲突。您应该在开始时使用布局管理器。保证可以很好地放置您的组件。
  • 自动 -1 甚至提到 setBounds。这仅供专家使用,即便如此,也只能在极少数情况下使用。
  • 我已经告诉他不要使用setBounds!,我自己也从来没有使用过!我只知道这是个坏主意。
  • 只是为了完成这件事。我通常对那些提出涉及null 布局问题的人的评论是...... “Java GUI 可能必须在多个平台上工作,在不同的屏幕上分辨率和使用不同的 PLAF。因此,它们不利于组件的精确放置。要组织组件以获得强大的 GUI,请改用布局管理器或它们的组合,以及用于空白空间的布局填充和边框。” i> -- 请参阅我的答案以获取示例。如果您想避免将来投反对票,请停止在答案中提及 null 布局。
猜你喜欢
  • 2010-11-05
  • 2010-12-06
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
相关资源
最近更新 更多