我是新来的Java,刚刚开始学习图形用户界面组件。所以,我正在阅读HeadfirstJava,有一个代码解释了JPanel
的油漆组件
方法。只要用户点击“改变颜色”按钮,它就可以改变椭圆形的颜色。-
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class SimpleGui3C implements ActionListener {
JFrame frame;
public static void main(String[] args) {
SimpleGui3C gui = new SimpleGui3C();
gui.go();
}
public void go() {
frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JButton button = new JButton("Change colors");
button.addActionListener(this);
MyDrawPanel drawPanel = new MyDrawPanel();
frame.getContentPane().add(BorderLayout.SOUTH, button);
frame.getContentPane().add(BorderLayout.CENTER, drawPanel);
frame.setSize(500,500);
frame.setVisible(true);
}
public void actionPerformed(ActionEvent event) {
frame.repaint();
}
}
MyDrawPanel类-
import javax.swing.*;
import java.awt.*;
class MyDrawPanel extends JPanel {
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
// GradientPaint gradient = new GradientPaint(70,70,Color.blue,150,150,Color.orange);
int red = (int) (Math.random() * 255);
int green = (int) (Math.random() * 255);
int blue = (int) (Math.random() * 255);
Color startColor = new Color(red, green, blue);
red = (int) (Math.random() * 255);
green = (int) (Math.random() * 255);
blue = (int) (Math.random() * 255);
Color endColor = new Color(red, green, blue);
GradientPaint gradient = new GradientPaint(70,70,startColor,150,150,endColor);
g2d.setPaint(gradient);
g2d.fillOval(70,70,100,100);
}
}
我从这个例子中得到了所有的东西,除了我们调用repaint()
方法的部分。
书中提到,只需覆盖JPanel
的paintcomponent
方法,当您调用repaint()
时,它将调用paintcomponent
来呈现内容(因为我们不直接调用paintcomponent
)。
现在,我通过扩展JPanel
创建了MyDrawPanel
类,并覆盖了它的油漆组件
方法。现在,当我们将draPanel
小部件放在框架上,然后单击鼠标时,正在调用repint()
方法。但是这个repaint()
方法正在使用frame
调用,它是JFrame
的一个对象。根据我对java的基本理解,如果我使用一个对象调用一个方法,该方法必须在该类或某个Super类中。我看不出如何在frame
上调用repaint()
将触发MyDrawPanel
的油漆组件。我做了一些挖掘,看看JFrame
和JPanel
是否共享相同的层次结构,以下是我发现的:
对象
--
`jcomponent` --> `jpanel`
`window` --> `frame` --> `jframe`
所以我想既然JFrame
和JPanel
都得到了paintComponent
和repaint
方法,也许我可以扩展JFrame
来创建MyDrawPanel
,而不是JPanel
,它应该可以正常工作。但它不是。它编译得很好,但抛出运行时异常。
真令人沮丧。可能是我没有掌握GUI概念,或者我的基础知识仍然薄弱。如果我错过了一些非常愚蠢的事情,请告诉我。
让我们从paintComponent
开始,它应该真正调用super。在执行任何自定义绘制之前,先绘制组件
接下来,你真的应该阅读AWT和Swing中的绘画以及执行定制绘画,以便更好地理解Swing中的绘画工作方式repaint
不直接调用paintComponent
,它要求RepaintManager
在事件队列上安排一个paint
事件,该事件在将来的某个时候由事件调度线程处理,然后根据容器的需要处理paint
事件
所以我想既然JFrame和JComponent都获得了油漆组件
不,他们没有。JFrame
(它是父类)没有油漆组件
方法
也许我可以扩展Jframe来创建MyDrawPanel而不是Jpanel,它应该可以正常工作。”
不,你不应该,除了JFrame
没有paintComponent
之外,还有很多事情可能会干扰你可能尝试在JFrame
上执行的任何自定义绘制,你应该继续按原样构建代码
我使用子JPanel构造JScrollPane,然后尝试将JScrollPane添加到父JPanel中,希望有一个可滚动的自定义JPanel。 我有一个大的细白线前面的所有我的组件,他们是没有滚动。有什么想法吗?
我是Java GUI编程新手,对何时使用哪些工具有几个问题。 当我的应用程序运行时,会出现一个JFrame,它使用内容面板显示用户3个按钮。我希望每个按钮都能显示不同的屏幕,但不能在单独的窗口中打开。为了实现这一点,我目前正在处理当前的JFrame,并用新内容创建一个新的JFrame。以下是我的问题。 > 我应该为每一次按钮点击创建一个新的JPanel,而不是创建一个新的JFrame吗?如果这个问
问题内容: 我正在学习Java gui。我学会了创建窗口的方法是继承或扩展类,并且很好地使用它,因为它包含窗口的所有属性。现在,如果要在此窗口中添加一些内容,则需要使用方法。但是今天我碰到了一个窗口,我们可以通过添加东西。 两种方法有什么区别?它们之间有某种联系吗? 问题答案: 您不应不必要地扩展该类(仅当您向该类添加其他功能时) JFrame : 扩展和。 它是一个顶层容器,用于表示窗口的最低要
我有一个带有卡布局组件的JFrame。我正在使用卡布局在应用程序执行的不同时刻在不同的JPanel之间切换。在某些时候,我正在使用摇摆工人对象来生成一些XML文件。在这段时间里,我想在我的窗口中显示另一个JPanel,告诉用户等待。在这个JPanel上,我想在3个标签之间切换。 吉列布尔1会说:“请稍候。 吉拉贝尔2会说:“请稍候..” 吉拉贝尔3会是:“请稍候...” 现在代码如下: Swing
我正在学习Java GUI。我学习创建窗口的方法是继承或扩展类,使用它是很好的,因为包含窗口的所有属性。现在如果我想在这个窗口中添加一些东西,我需要使用方法。但是今天我遇到了,它也创建了一个windows,我们可以通过添加内容。 这两种方法有什么区别?他们有什么关系吗?
我知道同样的问题已经被问过很多次了,但是我似乎真的没有在我的代码中发现阻碍JPanel类型的对象显示在JFrame中的错误。下面是扩展JFrame的类的构造函数: 当我运行main方法(这里没有显示)时,它只显示框架和按钮。如果有人能在这方面给点提示,我会非常感谢的。