我正在制作一个最多10位数的七段显示计算器的模拟器。 我有逻辑,我有一个10个对象的数组。这些对象接收一个数字并“打开”在画布上显示正确数字所需的段。一世 我试图让10个单独的画布'彼此相邻,并有一个绘制的绘图功能 根据“打开”的段,每个数字中的正确数字。无论如何,我可以想象 那部分。我似乎无法弄清楚的部分是如何在单个JFrame上将10个单独的画布“彼此相邻”。我尝试使用10个面板,但格式化不起作用,我遇到了问题。关于如何制作这个的任何建议?
答案 0 :(得分:3)
这是7段显示设置的一个非常基本的例子,仅使用自定义JPanel
s ...
显示中的每个元素只是一个JPanel
,带有一些额外的“属性”,然后在另一个JPanel
上布局,作为主要显示。您可以通过使用boolean
数组来实现打开和关闭哪些切片,其中position;
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
声明可能有一种非常聪明的方法,但我现在真的不能被打扰......
我会做的是,使用SegmentDisplay
或JPanel
之类的内容将每个GridBagLayout
添加到FlowLayout
...