Я работаю над простой панелью рисования на Java, и у меня есть несколько инструментов, с которыми пользователь может работать: ручку и ластик. Но JComboBox, используемый для выбора инструмента, не появляется, даже если он добавлен. Я слышал, что пользовательская краска будет скрывать любые JComponents. Если это так, как я могу заставить JComboBox всегда быть наверху?Почему мой JComboBox не рисует мои рисунки?
Изображение окна:
Вот мой код:
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class DrawFrame extends JFrame implements MouseMotionListener, Runnable {
private static final long serialVersionUID = 1L;
private Image dbi;
private Graphics dbg;
ArrayList<Integer> px = new ArrayList<Integer>();
ArrayList<Integer> py = new ArrayList<Integer>();
int mx;
int my;
@SuppressWarnings("rawtypes")
JComboBox tool = new JComboBox();
@SuppressWarnings("unchecked")
public DrawFrame() {
setSize(480, 480);
setTitle("ScratchPad _14");
setLayout(new FlowLayout());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setBackground(Color.WHITE);
setOpacity(1);
tool.addItem("Pen");
tool.addItem("Eraser");
tool.setEnabled(true);
add(tool);
setVisible(true);
addMouseMotionListener(this);
}
/*@Override
public void mouseClicked(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseEntered(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseExited(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mousePressed(MouseEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void mouseReleased(MouseEvent arg0) {
// TODO Auto-generated method stub
}*/
public static void main(String[] args) {
// TODO Auto-generated method stub
DrawFrame df = new DrawFrame();
Thread t = new Thread(df);
t.start();
}
public void paint(Graphics g) {
dbi = createImage(getWidth(), getHeight());
dbg = dbi.getGraphics();
draw(dbg);
g.drawImage(dbi, 0, 0, null);
}
private void draw(Graphics g) {
// TODO Auto-generated method stub
super.paint(g);
g.setColor(getBackground());
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.BLACK);
for (int i = 0; i < px.size(); i++) {
g.fillOval(px.get(i), py.get(i), 3, 3);
}
g.setColor(Color.BLUE);
g.drawString("(" + mx + ", " + my + ")", mx + 10, my - 5);
repaint();
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true) {
try {
Thread.sleep(5);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
@Override
public void mouseDragged(MouseEvent m) {
// TODO Auto-generated method stub
int x = m.getX();
int y = m.getY();
mx = x;
my = y;
px.add(x);
py.add(y);
}
@Override
public void mouseMoved(MouseEvent m) {
// TODO Auto-generated method stub
int x = m.getX();
int y = m.getY();
mx = x;
my = y;
}
}
Заранее спасибо!
Удаление 'super.paint (g)' не делает ничего видимого. И кадр двойной буферизации. –
Никогда не прекращайте вызов super.paint, это не проблема. Проблема заключается в том, что 'super.paint', красит дочерние компоненты, но потом вы нарисовываете их, и да, вы дважды буферизировали фрейм, но угадайте, что JComponent имеет двойной буфер по умолчанию, избавляя вас от необходимости делать это самостоятельно , JFrame состоит из панели JRootPane, JLayeredPane, панели контента и стекла, и вы только что нарисовали ее. Если вы хотите исправить эту проблему, отделите свою собственную покраску и компоненты. – MadProgrammer
В eclipse, а не вручную двойная буферизация заставляет рисунок мигать со слишком большим количеством элементов на экране. –