繁体   English   中英

如何将JButton移动到JPanel的右侧?

[英]How can I move my JButton to the right side of my JPanel?

对于编程班,我被要求创建一个iCalendar应用程序的副本。 我正在使用JAVA对其进行编码,并使用JFrame和JPanel进行绘制。 这是我的问题的SSCCEE:

import java.awt.*;

import javax.swing.*;

public class Mainie extends JFrame {
    private JButton back = new TriangleButton(true),
            front = new TriangleButton(false);
    public Mainie(){
        super();
        setSize(800, 400);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        final JPanel months = new JPanel();
        final JPanel days = new JPanel();
        JLabel one = new JLabel("Hallo");
        one.setHorizontalAlignment(JLabel.CENTER);
        back.setHorizontalAlignment(SwingConstants.LEFT);
        front.setHorizontalAlignment(SwingConstants.RIGHT);
        months.setLayout(new BorderLayout());
        months.add(back, BorderLayout.WEST);
        months.add(one, BorderLayout.CENTER);
        months.add(front, BorderLayout.EAST);

        days.setLayout(new GridLayout(1,1));
        days.add(new JButton("Meister Camickr"));

        months.setAlignmentX(CENTER_ALIGNMENT);
        add(months, BorderLayout.NORTH);
        add(days, BorderLayout.CENTER);

        setVisible(true);
    }

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

class TriangleButton extends JButton {
    private Shape triangle = createTriangle();

    public void paintBorder(Graphics g) {
        ((Graphics2D) g).draw(triangle);
    }

    public void paintComponent(Graphics g) {
        ((Graphics2D) g).fill(triangle);
    }

    public Dimension getPreferredSize() {
        return new Dimension(200, 100);
    }

    public boolean contains(int x, int y) {
        return triangle.contains(x, y);
    }

    public TriangleButton(boolean pointLeft) {
        super();
        if (!pointLeft)
            this.triangle = createRTriangle();
    }

    private Shape createTriangle() {
        Polygon p = new Polygon();
        p.addPoint(0, 20);
        p.addPoint(20, 0);
        p.addPoint(20, 40);
        return p;
    }

    private Shape createRTriangle() {
        Polygon p = new Polygon();
        p.addPoint(20, 20);
        p.addPoint(0, 0);
        p.addPoint(0, 40);
        return p;
    }
}

如果您对此进行编译,则可以看到我的JButton距左侧太远。 如何将其向右移动?

这些按钮的基本问题是按钮非常宽,可视指示器在左侧。 在他们周围放一个边界,这很明显。

OTOH我将使用完全不同的方法,对按钮使用文本,并使用工厂方法使它们看起来像预期的那样。

在此处输入图片说明在此处输入图片说明

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

public class CustomPointerButtons {

    JPanel ui;

    CustomPointerButtons() {
        initUI();
    }

    private final void initUI() {
        ui = new JPanel(new BorderLayout(4, 4));

        JPanel topPanel = new JPanel(new BorderLayout(4, 4));

        ui.add(topPanel, BorderLayout.PAGE_START);
        ui.add(new JButton("Mister Mix")); //will default to CENTER

        topPanel.add(new JLabel("Blah, Blah.."));
        JButton back = getMinimalButton(new String(Character.toChars(9668)));
        topPanel.add(back, BorderLayout.LINE_START);

        JButton forward = getMinimalButton(new String(Character.toChars(9658)));
        topPanel.add(forward, BorderLayout.LINE_END);
    }

    public JButton getMinimalButton(String text) {
        JButton b = new JButton(text);
        b.setFont(b.getFont().deriveFont(40f));

        b.setMargin(new Insets(0,0,0,0));
        b.setContentAreaFilled(false);
        b.setBorder(null);

        return b;
    }

    public final JComponent getUI() {
        return ui;
    }


    public static void main(String[] args) {
        Runnable r = new Runnable() {
            @Override
            public void run() {
                JFrame f = new JFrame("Custom Pointer Buttons");
                f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
                f.setContentPane(new CustomPointerButtons().getUI());
                f.pack();
                f.setLocationByPlatform(true);
                f.setVisible(true);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

问题是您的随机首选大小不代表三角形的实际大小。

您可以执行以下操作:

public Dimension getPreferredSize() {
//return new Dimension(200, 100);
Rectangle bounds = triangle.getBounds();
return new Dimension(bounds.width, bounds.height);
}

您仍然有其他问题,因为您仍然会有绘画瑕疵。 覆盖方法时,应始终调用super.paintComponent():

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    ((Graphics2D) g).fill(triangle);
}

但是,这仍然不能真正起作用,因为该按钮还可以进行其他绘画。 因此,真正的问题是您不应该尝试对按钮进行自定义绘制。 您真正想要做的是对Icon自定义绘制。 然后,您可以将图标添加到按钮。

您可能要查看“ 玩形状游戏” 您可以使用ShapeIcon类创建图标。 因为我想所有形状都不能用ascii字符表示,所以这将提供更灵活的解决方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM