Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将JButton移动到JPanel的右侧?_Java_Swing_User Interface_Jpanel_Jbutton - Fatal编程技术网

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

Java 如何将JButton移动到JPanel的右侧?,java,swing,user-interface,jpanel,jbutton,Java,Swing,User Interface,Jpanel,Jbutton,对于编程类,我被要求创建iCalendar应用程序的副本。我用JAVA编写代码,用JFrame和JPanel绘制。以下是我的问题: import java.awt.*; import javax.swing.*; public class Mainie extends JFrame { private JButton back = new TriangleButton(true), front = new TriangleButton(false);

对于编程类,我被要求创建iCalendar应用程序的副本。我用JAVA编写代码,用JFrame和JPanel绘制。以下是我的问题:

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我将使用一种完全不同的方法,为按钮使用文本,并使用工厂方法使它们看起来像预期的那样


问题是你随机选择的大小并不代表三角形的真实大小

您可以执行以下操作:

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);
}
但是,这仍然不起作用,因为按钮也可以进行其他绘制。因此,真正的问题是,您不应该尝试对按钮进行自定义绘制。您真正想要做的是自定义绘制
图标
。然后,您可以将图标添加到按钮

你可能想退房。您可以使用
ShapeIcon
类创建图标。这将提供一个更灵活的解决方案,因为我想并非所有形状都由ascii字符表示

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