这是绘制椭圆形的简单示例.
public class SwingPainter extends JFrame{
public SwingPainter() {
super("Swing Painter");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
getContentPane().add(new MySwingComponent());
setSize(200, 200);
setVisible(true);
}
public static void main(String[] args) {
new SwingPainter();
}
class MySwingComponent extends JComponent {
public void paintComponent(Graphics g) {
System.out.println("paintComponent");
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(10, 10, 50, 50);
}
@Override
protected void paintBorder(Graphics g) {
System.out.println("Paint border");
super.paintBorder(g);
}
@Override
protected void paintChildren(Graphics g) {
System.out.println("Paint children");
super.paintChildren(g);
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是在调试模式或在绘制之前向控制台添加一些信息(如示例中),您可以看到swing绘制组件两次.
的paintComponent
油漆边框
画儿童
的paintComponent
油漆边框
画儿童
我无法理解它为什么会发生,但我认为它会影响困难的GUI中的性能.
我有一个JFrame,其中包含2个JPanel子类和BorderLayout中的2个JLabel.其中一个JPanel包含JButtons,另一个用于显示图形.JLabels位于北部和南部,西部是JPanel按钮,中间是JPanel.
显示JPanel需要不断刷新,所以我通过swing计时器生成的动作事件调用它的repaint()方法.我也覆盖它的paintComponent()方法来做我的绘图.
而不是显示我绘制的内容,"JFrame的内容"被绘制到显示JPanel上.我知道在完成绘图之前,我可以通过使用g.fillRect()或super.paintComponent()简单地"清除"显示JPanel.
我只是好奇为什么会这样.
我正在使用jdk 1.6u27.下面是我的代码:
package test;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class Main {
public static void main(String[] args) {
Simulation sim = new Simulation();
}
}
class Simulation extends JFrame {
public JLabel state;
private JLabel id;
private ButtonPanel control;
private Display display;
public Simulation() {
id = new JLabel("Test");
state = new JLabel("Test");
control = new ButtonPanel();
display = new Display(this);
this.setLayout(new BorderLayout());
this.add(id, BorderLayout.NORTH);
this.add(control, BorderLayout.WEST);
this.add(display, BorderLayout.CENTER);
this.add(state, BorderLayout.SOUTH);
this.setSize(500, …Run Code Online (Sandbox Code Playgroud) 我刚刚开始编写视频游戏编码,我听说在JPanel上绘制所有绘图并将该面板附加到JFrame上比简单地绘制JFrame更好.我只是想知道为什么这样更好?
我遇到了一个问题.我的图像太大,所以它扩大了相应的JMenuItem.我不想开发自行车
ImageIcon image = new ImageIcon(new ImageIcon("/home/template/img.jpg")
.getImage().getScaledInstance(32, 32, Image.SCALE_DEFAULT));
Run Code Online (Sandbox Code Playgroud)
还有其他方法可以实现吗?
我正在使用Java2D进行我正在编写的游戏,并且在我开始将其与其他swing组件集成之前没有遇到任何问题.我的问题是当我添加到JFrame的第一个组件不是我正在绘制的画布时,当我将鼠标悬停在文本窗格的滚动条上时,我会看到一个奇怪的神器.每次执行应用程序时都会发生这种情况.当我第一次使用画布时,没有问题.
出于某种原因,这似乎只发生在Windows上,当使用默认的Java2D管道时(恰好是sun.java2d.d3d = true),并且会发生工件.当我设置sun.java2d.opengl = true或sun.java2d.noddraw = false AND sun.java2d.d3d = false时,它不会发生.
我猜这是Direct3D Java2D管道的某种错误?我可以轻松地解决它,但很想知道是否有其他人遇到过这样的问题?我正在运行最新的JDK7u7,但它也适用于以前的版本.我应该注意,如果我最小化窗口并恢复它,那么工件就会消失,并且在我重新启动应用程序之前永远不会返回.
有神器:

没有工件(首先添加画布而不是JLabel图像):

如果有人对此有任何进一步的信息,我会很感激.谢谢!
我hava添加1.TextArea 2.TextField然后我开始在容器上连续添加JButton ...,现在通过使用JRadioButton我想使用此代码从容器中删除JButton
i=0;
k=0;
while(!birdButton[i].isSelected()){
i++;
}
System.out.println(i);
k=i+2;
list.removeElementAt(i);
listName.removeElementAt(i);
System.out.println(k);
c.getContentPane().remove(k);
Run Code Online (Sandbox Code Playgroud)
但是当我选择第一个radiobutton时,由于k = i + 2,应该删除第一个JButton; 而不是删除这个删除TextArea(第一个).当我选择第3个radiobutton时,第1个JButton被删除.任何人都可以让我知道问题是什么?并且也System.out.println(i); System.out.println(k);没有打印任何值....这是代码
public class RadioDemo implements ActionListener {
String buttonName;
JPanel radioPanel = new JPanel();
ButtonGroup group = new ButtonGroup();
Enumeration enl;
int result;
ActionEvent e;
JRadioButton birdButton[];
int i, k;
Vector<String> listName;
Vector<JComponent> list;
Container c;
public RadioDemo(Vector<String> listName,Vector<JComponent> list,Container c) {
birdButton=new JRadioButton[listName.size()];
this.listName=listName;
this.c=c;
this.list=list;
i = 0;
for (String buttonName : listName){
birdButton[i] = new …Run Code Online (Sandbox Code Playgroud) 我正在尝试建立有关SwingPropertyChangeSupport的问题的答案
我试图在非常有用的Hovercraft Full Of Eels的答案中修改这里给出的代码: WindowListener不能按预期工作,以允许在通过输入对话框输入更改时更新显示的数组.
数组已更新,但未在GUI中刷新.我希望有人能告诉我哪里出错了.
这是代码:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextArea;
import javax.swing.event.SwingPropertyChangeSupport;
public class Main {
public static void main(String[] arg) {
GuiForUpdate display = new GuiForUpdate();
display.setVisible(true);
}
}
class GuiForUpdate extends JFrame implements ActionListener {
/**
*
*/
private static final long serialVersionUID = 1L;
private FocusListener focusListener;
private String mList;
private JButton changeArrayButton;
private JTextArea codeIn, …Run Code Online (Sandbox Code Playgroud) 有没有办法在Java中创建一个动态缩放框,其中包括例如光标周围的20x20pix区域(但即使光标将移动到应用程序框架之外)并且将在例如小型JPanel中显示?
我在询问Color Chooser程序的背景下.需要实现的最后一个功能就是Zoom Box.