【问题标题】:Adding a JLabel in relative position to buttons在按钮的相对位置添加 JLabel
【发布时间】:2014-03-04 08:10:24
【问题描述】:

好的,这是我目前的相关代码。

  for (int i = gameLines - 1; i > 0; i--)
  {
     for (int j = 0; j < i; j++)
     {
        JButton jButton = new JButton();
        jButton.setSize(buttonWidth, buttonHeight);
        jButton.setText("" + line[i].charAt(j));
        int x = ((buttonWidth / 2 * gameLines + 1) - (buttonWidth / 2 * i) + (buttonWidth * j));
        int y = (gameLines - (i + 1)) * buttonHeight;
        jButton.setLocation(x, y);
        panel.add(jButton);
        button[i][j] = jButton;
        button[i][j].setActionCommand(Integer.toString(i) + "." + Integer.toString(j));
        button[i][j].addActionListener(this);
     }
  }

代码创建所有按钮并将其放置在我想要的位置。这花了我一段时间才弄清楚。我原本是 AppleSoft BASIC 程序员,很抱歉 i & j 变量名。

现在来玩玩。在底部 3 行按钮的右侧,我想放置一个 jLabel。 jLabel 的右边缘与顶行中最右侧按钮的右边缘对齐。每个中的文本都将右对齐,以 : 和最多 4 位数字结尾。

我想我可以像计算按钮位置一样简单地计算位置。文本,我将根据 switch/case 添加。

我在理解 JLabels 时遇到了麻烦,所以如果能得到任何帮助,我将不胜感激。

我目前的想法是:在j循环之后插入

if (i < 4)
{
    JLabel jLable = new JLabel();
    JLabel.setSize(???, buttonHeight);
    Calculate value of X;
    int y = (gameLines - (i +1)) * buttonHeight;
    jLabel.setLocation(x,y);
    switch (i)
    {
       case 3:
          jLabel.setText("Buttons Clicked: " + buttonsClicked);
          break;
       case 2:
          etc.
    }
    panel.add(jLabel);
}

请帮忙

【问题讨论】:

标签: java swing jbutton jlabel layout-manager


【解决方案1】:

出于多种原因,我会避免使用绝对布局。当您在其他 PC 上运行它时,整个事情就开始崩溃,相反,您应该依赖 Swing 中提供的布局管理器 API。

以下示例使用复合布局方法。每一行都是它自己的容器 (JPanel),然后每一行都被添加到主面板中。

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class ButtonPyramid {

    public static void main(String[] args) {
        new ButtonPyramid();
    }

    public ButtonPyramid() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        private String[] lines;

        public TestPane() {
            lines = new String[]{
                "AAFITQPNXBE",
                "?AXOPKMSUR",
                "TGKFREUDI",
                "DFEAAEOY",
                "ZDE?VIF",
                "G@RMLC",
                "YUJGO",
                "NSCP",
                "KO@",
                "MI",
                "Y",
                "B",
            };

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.weightx = 1;
            gbc.gridy = 1;
            gbc.gridx = 0;
            for (String line : lines) {
                JPanel panel = new JPanel(new GridBagLayout());
                for (char ch : line.toCharArray()) {
                    JButton btn = new JButton(Character.toString(ch));
                    btn.setMargin(new Insets(10, 10, 10, 10));
                    panel.add(btn);
                }
                add(panel, gbc);
                gbc.gridy++;
            }
            JLabel label = new JLabel(":1234");
            gbc.gridy -= 3;
            gbc.gridx++;
            gbc.anchor = GridBagConstraints.NORTH;
            add(label, gbc);
        }
    }

}

如果您不希望文本占用另一列,可以尝试一个小技巧,将标签布局约束更改为如下所示...

JLabel label = new JLabel(":1234");
gbc.gridy -= 3;
gbc.anchor = GridBagConstraints.NORTHEAST;
add(label, gbc);

查看Laying out Components within a Container 了解想法和详情

           lines = new char[][]{...};

           for (int outter = 0; outter < lines.length; outter++) {
                JPanel panel = new JPanel(new GridBagLayout());
                for (int inner = 0; inner < lines[outter].length) {
                    char ch = lines[outter][inner];
                    JButton btn = new JButton(Character.toString(ch));
                    btn.setMargin(new Insets(10, 10, 10, 10));
                    panel.add(btn);
                }
                add(panel, gbc);
                gbc.gridy++;
            }

【讨论】:

  • thatyour 键盘的样子吗?难怪你回答问题这么快。你来自另一个世界;)
  • @peeskillet 不,我只是把头撞在键盘上,直到有东西起作用;)
  • 我是动态的,基于 gameLines 变量。您的 JLabel 缺少“Buttons Clicked:”部分,我的目标是将其放在第一行的按钮下方。
  • @karl 请记住,这只是一个示例,我没有您的完整代码可以使用,这并不能帮助您以什么方式实现这一目标? “在底部 3 行按钮的右侧,我想放置一个 jLabel。”“以 : 和最多 4 位数字结尾” 是我必须继续...
  • @MadProgrammer 我希望我在这里听起来不是忘恩负义,但我确实声明“现在为了好玩。在底部 3 行按钮的右侧,我想放置一个 jLabel。 jLabel 的右边缘与顶行中最右侧按钮的右边缘对齐。每个中的文本将右对齐,以 : 和最多 4 位数字结尾。 - 从原始评论复制/粘贴。 “Buttons Clicked: 1234”,可能是最短的文本,但理论对于其他人来说是一样的。
猜你喜欢
  • 1970-01-01
  • 2013-06-08
  • 2016-06-09
  • 2017-09-04
  • 1970-01-01
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多