- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想向 JFrame 添加渐变背景。在 JFrame 中,我没有创建 JPanel,而是使用了在创建 JFrame 时自动添加的 JPanel。我在 JPanel 实例上找到的所有在线调用 paintComponent()
的示例,但如前所述,在我的例子中我没有专门实例化一个。我知道 paintComponent()
需要在组件上调用,因此不能在 JFrame 上调用,那么我是否需要创建并添加 JPanel 才能实现此目的?我过去曾成功地这样做过,但我正在努力使我的代码尽可能精简,所以如果不需要,我不想创建第二个 JPanel。这是我的代码:
public class Main extends JFrame {
private static final long serialVersionUID = 1L;
JPanel pane;
public Main() {
int WIDTH = 700, HEIGHT = 400;
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBackground(Color.GRAY);
setSize(WIDTH, HEIGHT);
setLocationRelativeTo(null);
pane = (JPanel) getContentPane();
pane.setOpaque(false);
pane.setLayout(new BorderLayout());
pane.setBorder(new EmptyBorder(20, 20, 20, 20));
// SOME OTHER STUFF
}
protected void paintComponent(Graphics grphcs) {
Graphics2D g2d = (Graphics2D) grphcs;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
GradientPaint gp = new GradientPaint(0, 0, new Color(255, 195, 225), 0, getHeight(), new Color(139, 207, 236));
g2d.setPaint(gp);
paintComponent(grphcs);
}
}
我将不胜感激。
最佳答案
so do I need to create and add a JPanel in order to achieve this?
是的。
but I'm trying to keep my code as streamlines as possible, so I don't want to create a second JPanel if I don't need to.
这里不会浪费,因为简化上述代码的方法是去掉 extends JFrame
。没有必要这样做,并且有很多理由不这样做。让类扩展 JFrame 是在逼迫自己创建和显示 JFrame,而这通常需要更大的灵 active 。事实上,我敢打赌,我创建的和看到的大多数 Swing GUI 代码都不扩展 JFrame,而且实际上您很少想这样做这。更常见的是,您的 GUI 类将用于创建 JPanel,然后可以将其放入 JFrames 或 JDialogs,或 JTabbedPanes,或通过 CardLayouts 在任何需要的地方进行交换。这将大大增加您的 GUI 编码的灵 active 。
例如,
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class MainPanel extends JPanel {
private static final long serialVersionUID = 1L;
private static final int PREF_W = 700;
private static final int PREF_H = 400;
private static final Color GRAD_COLOR_1 = new Color(255, 195, 225);
private static final Color GRAD_COLOR_2 = new Color(139, 207, 236);
public MainPanel() {
setBackground(Color.GRAY);
setSize(WIDTH, HEIGHT);
setLayout(new BorderLayout());
setBorder(new EmptyBorder(20, 20, 20, 20));
// SOME OTHER STUFF
}
// to set the preferred size of the JPanel/GUI
@Override
public Dimension getPreferredSize() {
if (isPreferredSizeSet()) {
return super.getPreferredSize();
}
return new Dimension(PREF_W, PREF_H);
}
@Override
protected void paintComponent(Graphics grphcs) {
super.paintComponent(grphcs); // ** don't forget this.
Graphics2D g2d = (Graphics2D) grphcs;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
GradientPaint gp = new GradientPaint(0, 0, GRAD_COLOR_1, 0, getHeight(), GRAD_COLOR_2);
g2d.setPaint(gp);
g2d.fillRect(0, 0, getWidth(), getHeight());
}
private static void createAndShowGui() {
MainPanel mainPanel = new MainPanel();
// create the JFrame when/if needed
JFrame frame = new JFrame("Main");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
createAndShowGui();
});
}
}
But doesn't it still create unneeded JPanels?
那是在担心错误的事情。创建了一个 JPanel,即 contentPane,这不会对您的程序或您的资源使用产生真正的不利影响。
My actual class extends JPanel, so when I instantiate that there is one created, plus the default panel which was created when we created the JFrame. Isn't that kind of the same as what I had before, I mean I could have just created a second JPanel and added it to my main class (JFrame) and called paintComponent() on it.
如上所述——不要小题大做,也不要过早优化。如果您担心程序中的资源滥用,请分析它,然后解决具有实际影响的问题。
What are the advantages of extending JPanel instead of JFrame
我已经提到了很多 - 我上面的回答特别令人困惑吗?
关于java - 在默认 JFrame 面板上使用 paintComponent(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36389928/
我是 Java 的新手。下面是两个类,一个类扩展JComponent,需要重写paintComponent方法。另一个类扩展了JPanel,同样需要重写paintComponent方法。 为什么Dra
我想知道 paintcomponent() 和 paintcomponents() 有什么不同? 当我从 paintcomponent 使用它时,它显示了我们想要的一切,但是 paintcompone
public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2 = (Gr
我稍后在我的主方法中使用这样的调用: public static void main(String[] args) { SwingUtilities.invokeLater(new Runna
所以我正在开发一款由两个网格组成的游戏。每个网格都是一个 JPanel,我在其中(可能)在网格中的每个空间上绘制一个对象。我发现绘制对象正在减慢应用程序的速度,我想知道是否有办法防止这种情况发生。 详
这个问题已经有答案了: paintComponent is not being called in JPanel (1 个回答) 已关闭 4 年前。 很抱歉,这个问题可能已经解决了,但我已经到处搜索但
我的问题非常简单:我有这个小程序,它只是没有显示我正在尝试制作的红框: 主要 public class Main { public static void main(String[] args
我正在尝试编写一个类似这样的应用程序: - 显示对话框 - 当用户单击“确定”时,关闭对话框,转到主应用程序 以下是相关代码片段: public class Owari extends JPanel
这应该是一个抽象类,可以扩展以绘制连接 JPanel 上某些坐标点的线。 但是,永远不会调用专门的 PaintComponents() 方法。我已经看到其他答案并尝试使用他们的解决方案,例如检查我是否
我有以下结构: method1 method2 ... methodn methodX 方法x包含: JFrame frame = new JFrame("Sample"); frame.setDef
我在使用矩形时遇到一些问题 这是我的代码: import java.awt.*; import javax.swing.*; import java.util.*; public class squa
我正在尝试制作西洋跳棋游戏,但以下架构没有在 JFrame 上显示我做错了什么 //基类 import java.awt.event.MouseEvent; import java.awt.event
问题涉及我项目中的 2 个类:主类和绘图类。主类创建 JFrame 并在其中放置 2 个 JPanel。第一个 JPanel 包含用于输入数字的 JTextFields 和用于选择不同选项的 JBut
我已经处理学校作业有一段时间了。但我无法真正理解我应该做什么。作业明天就要交了,我感觉压力很大。 任务是,我将获取一些图片,将它们放在窗口中,然后能够在它们周围移动并能够旋转。 最大的问题是我不知道如
我在使用 PaintComponent 绘制形状时遇到不清楚的问题。 public class Shape extends JPanel { private String shape; private
据我了解,Swing 将决定何时需要重新绘制,这可以解释为什么 paintComponent() 执行两次。但我制作了一个 hibernate 16 毫秒、重绘、 hibernate 16 毫秒、重绘
这是我的代码,它工作完美,并在 JFrame 中绘制形状。每个方法都通过其名称进行调用,在我的程序中我没有调用任何 paintComponent() 方法。那么paintComponent()方法的调
我正在尝试在 JPanel 上绘制一些内容,但似乎我遇到了 paint 和 paintComponent 方法的问题。可能与双缓冲有关,但我不确定。 public void PaintComponen
我是 Swing 新手,正在尝试将图像背景添加到我的 JFrame 中。但是我的 paintComponent 方法不起作用。您能否就如何修复我的代码以便在背景中绘制图像提供一些建议? 代码如下: /
我正在尝试编写简单的程序,当鼠标拖动时绘制圆圈,但paintComponent方法仅被调用一次(启动后)。 在这个类中,我有一些在拖动鼠标时绘制圆圈的方法。 import javax.swing.*;
我是一名优秀的程序员,十分优秀!