gpt4 book ai didi

java - 多个 Canvas 彼此相邻

转载 作者:行者123 更新时间:2023-11-30 08:25:26 29 4
gpt4 key购买 nike

我正在为最多 10 位的七段显示计算器制作模拟器。我有一个逻辑,我有一个大小为 10 的对象数组。这些对象接受一个数字并“打开”在 Canvas 上显示正确数字所需的部分。我我试图让 10 个单独的 Canvas 彼此相邻并具有绘制功能根据“打开”的段,每个数字中的正确数字。不管怎样,我能想出那部分出来。我似乎无法弄清楚的部分是如何在单个 JFrame 上将 10 个单独的 Canvas 彼此相邻。我试过使用 10 个面板,但格式不工作,我遇到了问题。关于如何制作这个有什么建议吗?

最佳答案

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

Segment

显示中的每个元素只是一个带有一些附加“属性”的 JPanel,然后将其布置在另一个用作主要显示的 JPanel 上。您可以通过使用 boolean 数组来影响打开和关闭哪些段,其中位置;

  • 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 语句,但我现在真的不能被打扰......

然后我会做的是,使用 GridBagLayoutFlowLayout 将每个 SegmentDisplay 添加到 JPanel ...

关于java - 多个 Canvas 彼此相邻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22214932/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com