我希望有一个框架(或类似),其中包含5个按钮,每个按钮位于特定坐标(不是矩形顺序或严格网格)和一些连接某些按钮的线条。
我最初的做法是:
问题是,我可以放置按钮或画线。 我在2个晚上搜索网络,并且只找到可以做任何一个或两个的解决方案。我无法弄清楚它为什么不起作用。
这里的这个很好地解释了如何绘制多行:
但是我没有在与行相同的字段(组件)中获得任何可见按钮。 无论我尝试什么,它们总是不可见或在其他区域。
如果有人能给我一个简短解释的真实例子,我将非常感激。 我是Java的新手并教“我自己”,......
谢谢,Lubenja
在MadProgrammer的评论和eatinasandwich的回答之后编辑: <击> 我同意,这些布局经理可能会做得很好。我阅读了其中的一些内容,并认为如果您使用固定和矩形布局,它们会有所帮助。 但是,我希望有这样的东西(见下文)。因此,我想编写一个整体程序,这使我可以轻松地更改位置和/或添加新按钮和相应的行。因此,我更喜欢坐标而不是布局管理器。 (此处布局:http://4.bp.blogspot.com/-hSkZGDick6o/VIfkt-m6ZvI/AAAAAAAAAMw/MA2JunqHu0Q/s1600/Layout.png,无法上传图片)。 好的!布局经理可以做到这一点!
答案 0 :(得分:0)
您通常希望将面板用于您要绘制的任何内容。我想出了一个简单的例子。我将向您展示面板类,因为框架部分有点微不足道。您只需将此面板添加到您正在创建的框架中。
关于代码也只是几点。 MadProgrammer提到不使用绝对定位,他是正确的。这就是为什么当我覆盖paintComponent(重绘东西的方法)时,我使用按钮的位置来计算我的x和y值。我还使用JLabels作为网格布局的分隔符。你不需要这样做。事实上,我鼓励您浏览布局管理器并找到最有效的方法(可能是布局管理器和不同面板的组合)。
import java.awt.Color;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Point;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class MyPanel extends JPanel{
JButton button1 = new JButton("Button 1");
JButton button2 = new JButton("Button 2");
JButton button3 = new JButton("Button 3");
JButton button4 = new JButton("Button 4");
public MyPanel() {
setLayout(new GridLayout(3, 3));
setSize(512, 512);
setOpaque(false);
add(button1);
add(new JLabel());
add(button2);
add(new JLabel());
add(new JLabel());
add(new JLabel());
add(button3);
add(new JLabel());
add(button4);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
Point p1 = button1.getLocation();
p1.x += button1.getWidth() / 2;
p1.y += button1.getHeight() / 2;
Point p2 = button4.getLocation();
p2.x += button4.getWidth() / 2;
p2.y += button4.getHeight() / 2;
g.drawLine(p1.x, p1.y, p2.x, p2.y);
Point p3 = button2.getLocation();
p3.x += button2.getWidth() / 2;
p3.y += button2.getHeight() / 2;
Point p4 = button3.getLocation();
p4.x += button3.getWidth() / 2;
p4.y += button3.getHeight() / 2;
g.setColor(Color.BLUE);
g.drawLine(p3.x, p3.y, p4.x, p4.y);
}
}