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

标签 java swing user-interface jpanel jbutton

在编程类(class)中,我被要求创建 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 我会使用一种完全不同的方法,使用按钮文本和工厂方法来使它们看起来像预期的那样。

enter image description here enter image description here

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);
    }
}

关于java - 如何将 JButton 移动到 JPanel 的右侧?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26199634/

相关文章:

java - 如何使用 Java 在 JPanel 中显示 JTable?

java - public void actionPerformed(ActionEvent e) 中表达式的非法开始

java - ComboBox 未在 JTable 中显示其内容

java - 清除 JScrollPane 但不能然后 'attach' 表

java - Android SDK是否有意使用旧版本的ProGuard

java - Liquibase,如何在 Java 中以编程方式设置默认模式

java - Spring中如何使用通配符指定回滚?

user-interface - 用于显示分层餐厅菜单的最佳 Drupal GUI?

java - 为什么最大化窗口后会显示 JButton 和 JTextField?

android - TextView : adjust font size to match parent