目前我正在尝试拥有一个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用于绘制它的组件的那个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());
}
}
}