多个画布'彼此相邻

时间:2014-03-06 04:26:36

标签: java swing canvas jframe panel

我正在制作一个最多10位数的七段显示计算器的模拟器。 我有逻辑,我有一个10个对象的数组。这些对象接收一个数字并“打开”在画布上显示正确数字所需的段。一世 我试图让10个单独的画布'彼此相邻,并有一个绘制的绘图功能 根据“打开”的段,每个数字中的正确数字。无论如何,我可以想象 那部分。我似乎无法弄清楚的部分是如何在单个JFrame上将10个单独的画布“彼此相邻”。我尝试使用10个面板,但格式化不起作用,我遇到了问题。关于如何制作这个的任何建议?

1 个答案:

答案 0 :(得分:3)

这是7段显示设置的一个非常基本的例子,仅使用自定义JPanel s ...

Segment

显示中的每个元素只是一个JPanel,带有一些额外的“属性”,然后在另一个JPanel上布局,作为主要显示。您可以通过使用boolean数组来实现打开和关闭哪些切片,其中position;

  • 0是最高
  • 1& 2是左右上半部分
  • 3是中间
  • 4 * 5是左下半部分
  • 6是底部

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.LineBorder;

public class TestSegmentDisplay {

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

    private SegmentDisplay segmentDisplay;
    private int count = 0;

    public TestSegmentDisplay() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                segmentDisplay = new SegmentDisplay();

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(segmentDisplay);
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

                final Timer timer = new Timer(1000, new ActionListener() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        setSegmentValue(segmentDisplay, count);
                        count++;
                        if (count > 9) {
                            count = 0;
                        }
                    }
                });
                timer.start();

            }
        });
    }

    public static void setSegmentValue(SegmentDisplay display, int value) {

        boolean[] states = new boolean[]{
            false,
            false, false,
            false,
            false, false,
            false
        };
        switch (value) {
            case 0:
                states = new boolean[]{
                    true,
                    true, true,
                    false,
                    true, true,
                    true};
                break;
            case 1:
                states = new boolean[]{
                    false,
                    false, true,
                    false,
                    false, true,
                    false};
                break;
            case 2:
                states = new boolean[]{
                    true,
                    false, true,
                    true,
                    true, false,
                    true};
                break;
            case 3:
                states = new boolean[]{
                    true,
                    false, true,
                    true,
                    false, true,
                    true};
                break;
            case 4:
                states = new boolean[]{
                    false,
                    true, true,
                    true,
                    false, true,
                    false};
                break;
            case 5:
                states = new boolean[]{
                    true,
                    true, false,
                    true,
                    false, true,
                    true};
                break;
            case 6:
                states = new boolean[]{
                    true,
                    true, false,
                    true,
                    true, true,
                    true};
                break;
            case 7:
                states = new boolean[]{
                    true,
                    false, true,
                    false,
                    false, true,
                    false};
                break;
            case 8:
                states = new boolean[]{
                    true,
                    true, true,
                    true,
                    true, true,
                    true};
                break;
            case 9:
                states = new boolean[]{
                    true,
                    true, true,
                    true,
                    false, true,
                    true};
                break;
        }

        display.setSegments(states);

    }

    public static class SegmentDisplay extends JPanel {

        private Segement[] segemnts;

        public SegmentDisplay() {
            segemnts = new Segement[7];
            segemnts[0] = new Segement(Segement.Direction.HORIZONTAL);
            segemnts[1] = new Segement(Segement.Direction.VERTICAL);
            segemnts[2] = new Segement(Segement.Direction.VERTICAL);
            segemnts[3] = new Segement(Segement.Direction.HORIZONTAL);
            segemnts[4] = new Segement(Segement.Direction.VERTICAL);
            segemnts[5] = new Segement(Segement.Direction.VERTICAL);
            segemnts[6] = new Segement(Segement.Direction.HORIZONTAL);

            setLayout(new GridBagLayout());
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridx = 1;
            gbc.gridy = 0;
            add(segemnts[0], gbc);

            gbc.gridx = 0;
            gbc.gridy = 1;
            add(segemnts[1], gbc);
            gbc.gridx = 2;
            add(segemnts[2], gbc);

            gbc.gridx = 1;
            gbc.gridy++;
            add(segemnts[3], gbc);

            gbc.gridx = 0;
            gbc.gridy++;
            add(segemnts[4], gbc);
            gbc.gridx = 2;
            add(segemnts[5], gbc);

            gbc.gridx = 1;
            gbc.gridy++;
            add(segemnts[6], gbc);
        }

        public void setSegments(boolean[] states) {

            if (states != null && states.length > 0 && states.length == segemnts.length) {

                for (int index = 0; index < segemnts.length; index++) {
                    segemnts[index].setOn(states[index]);
                }

            }

        }

    }

    public static class Segement extends JPanel {

        public enum Direction {

            VERTICAL,
            HORIZONTAL;
        }

        public static final int SMALL_SIZE = 10;
        public static final int LARGE_SIZE = SMALL_SIZE * 4;

        protected static final Color OUT_LINE = new Color(128, 0, 0);
        protected static final Color ON_COLOR = Color.RED;
        protected static final Color OFF_COLOR = new Color(64, 0, 0);

        private final Direction direction;
        private boolean on;

        public Segement(Direction direction) {
            this.direction = direction;
            setBorder(new LineBorder(OUT_LINE));
            setOn(true);
            setOn(false);
        }

        public void setOn(boolean value) {
            if (on != value) {
                on = value;
                if (on) {
                    setBackground(ON_COLOR);
                } else {
                    setBackground(OFF_COLOR);
                }
            }
        }

        public boolean isOn() {
            return on;
        }

        public Direction getDirection() {
            return direction;
        }

        @Override
        public Dimension getPreferredSize() {
            return getDirection() == Direction.VERTICAL ? new Dimension(SMALL_SIZE, LARGE_SIZE) : new Dimension(LARGE_SIZE, SMALL_SIZE);
        }

    }

}

设置switch声明可能有一种非常聪明的方法,但我现在真的不能被打扰......

我会做的是,使用SegmentDisplayJPanel之类的内容将每个GridBagLayout添加到FlowLayout ...