java - 用画布显示问题
问题描述
目前我正在尝试拥有一个JFrame
包含两个JPanel
组件的组件-第一个JPanel
组件旨在保存用户可以单击以与程序交互并将图像绘制到屏幕上的各种按钮。第二个,这就是麻烦开始的地方,它持有Canvas
我试图吸引的实际对象。
我遇到的问题是第二个面板实际上并没有被吸引到。我尝试了各种其他方法和检查,但一切都表明当前代码应该可以工作。
作为测试,我只是想fillRect()
在绘图面板上做一个,但无济于事。这是我的代码:
//创建组件和JFrame:
public static void createDisplay() {
JFrame f = new JFrame();//When JFrame flowlayout manager removed, the rectangle was drawn.
c = new Canvas();
width = 500;
height = 500;
f.setLayout(new FlowLayout());
f.add(addButtons()); //private method that covers the button panel
JPanel drawPanel = new JPanel();
drawPanel.add(c);
c.setFocusable(false);
f.add(drawPanel);
f.setPreferredSize(new Dimension(height, width));
lstnr = new Listeners();
f.addKeyListener(lstnr);
f.addMouseListener(lstnr);
f.addMouseMotionListener(lstnr);
f.setLocationRelativeTo(null);
f.pack();
f.setVisible(true);
}
以及对屏幕进行实际绘图的代码:
private void render() {
bs = c.getBufferStrategy();
if(bs == null) {
c.createBufferStrategy(3);
return;
}
do {
do {
g = bs.getDrawGraphics();
l.setGraphicsObj(g);
g.clearRect(0, 0, width, height);
for(Symbols s : l.getSymbolsArray());
s.renderSymbols();
}
g.fillRect(0, 0, 50, 50); //Just to test & make sure it works
g.dispose();
}while(bs.contentsRestored());
bs.show();
}while(bs.contentsLost());
}
现在我想再次强调,当我从方法中删除片段时绘制了矩形。任何帮助深表感谢。f.setLayoutManager(new FlowLayout());
createDisplay()
解决方案
- 你有冲突的绘画系统。一个被用来绘制它
BufferStrategy
,一个被 Swing 用来绘制它的组件 - 在最好的情况下混合重量和重量轻的组件是有问题的,你应该尽你所能减少重叠
- A
Canvas
有一个默认的首选大小0x0
,FlowLayout
它将用于确定应该如何最好地布置它
一个“可能的”解决方案可能是专注于将其放置Canvas
在它自己的位置并分离 Swing 元素。
您仍然会遇到麻烦,因为您需要管理两个不同线程上下文之间的数据
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.image.BufferStrategy;
import java.util.concurrent.atomic.AtomicBoolean;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
PaintPane paintPane = new PaintPane();
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new ButtonPane(), BorderLayout.WEST);
frame.add(paintPane);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
paintPane.start();
}
});
}
public class ButtonPane extends JPanel {
public ButtonPane() {
setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.fill = GridBagConstraints.HORIZONTAL;
gbc.gridwidth = GridBagConstraints.REMAINDER;
for (int index =0; index < 5; index++) {
add(new JButton(Integer.toString(index)), gbc);
}
}
}
public class PaintPane extends Canvas {
private Thread renderThread;
private AtomicBoolean running = new AtomicBoolean(true);
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
public void start() {
if (renderThread != null) {
return;
}
running.set(true);
renderThread = new Thread(new Runnable() {
@Override
public void run() {
while (running.get()) {
render();
try {
Thread.sleep(5);
} catch (InterruptedException ex) {
}
}
}
});
renderThread.start();
}
public void stop() {
if (renderThread != null) {
return;
}
running.set(false);
renderThread.interrupt();
try {
renderThread.join();
} catch (InterruptedException ex) {
}
renderThread = null;
}
protected void render() {
BufferStrategy bs = getBufferStrategy();
if (bs == null) {
createBufferStrategy(3);
return;
}
do {
do {
Graphics g = bs.getDrawGraphics();
// :/
//l.setGraphicsObj(g);
g.clearRect(0, 0, getWidth(), getHeight());
//for (Symbols s : l.getSymbolsArray()) {
// // This is where g should be passed
// s.renderSymbols();
//}
g.setColor(Color.BLUE);
g.fillRect(0, 0, 50, 50); //Just to test & make sure it works
g.dispose();
} while (bs.contentsRestored());
bs.show();
} while (bs.contentsLost());
}
}
}
推荐阅读
- reactjs - 如何在 Reactjs 中从 Bootstrap 添加导航栏
- istio - 应用于特定工作负载的 Istio EnvoyFilter
- c++ - 是否分配给临时对象未定义行为的字段?
- python - Keras ImageDataGenerator 亮度范围
- html - 如何将博客网站页脚中的版权部分居中对齐?
- oracle - ORA-26781 不支持嵌套表错误 -- 仅在 Oracle 19.10 中发生
- json - Pentaho 数据集成 - 将 javascript JSON 修改为文件
- python - 无法从 Azure 上的 Django 加载静态 CSS
- sublimetext3 - 为什么 Sublime Text 3 的 View-In-Browser 插件不起作用
- java - 是否可以从列表的特定元素映射到自身?