用Java绘制按钮和线条?

时间:2014-12-09 23:09:03

标签: java swing jbutton line

我希望有一个框架(或类似),其中包含5个按钮,每个按钮位于特定坐标(不是矩形顺序或严格网格)和一些连接某些按钮的线条。

我最初的做法是:

  1. 打开一个框架
  2. 将按钮放在所需的坐标
  3. 使用按钮坐标
  4. 在按钮之间绘制线条

    问题是,我可以放置按钮或画线。 我在2个晚上搜索网络,并且只找到可以做任何一个或两个的解决方案。我无法弄清楚它为什么不起作用。

    这里的这个很好地解释了如何绘制多行:

    How to draw lines in Java

    但是我没有在与行相同的字段(组件)中获得任何可见按钮。 无论我尝试什么,它们总是不可见或在其他区域。

    如果有人能给我一个简短解释的真实例子,我将非常感激。 我是Java的新手并教“我自己”,......

    谢谢,Lubenja

    在MadProgrammer的评论和eatinasandwich的回答之后编辑: <击> 我同意,这些布局经理可能会做得很好。我阅读了其中的一些内容,并认为如果您使用固定和矩形布局,它们会有所帮助。 但是,我希望有这样的东西(见下文)。因此,我想编写一个整体程序,这使我可以轻松地更改位置和/或添加新按钮和相应的行。因此,我更喜欢坐标而不是布局管理器。 (此处布局:http://4.bp.blogspot.com/-hSkZGDick6o/VIfkt-m6ZvI/AAAAAAAAAMw/MA2JunqHu0Q/s1600/Layout.png,无法上传图片)。 好的!布局经理可以做到这一点!

1 个答案:

答案 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);

    }


}