Java J面板和渐变背景
Java Jpanels and Gradient Backgrounds
我是初学者,正在尝试创建 GUI。我有 4 个基本 类(见下文):
- GuiApp.java - 使用 main 方法,调用 MainFrame class
- MainFrame.Java - 扩展 JFrame - 添加 MainPpanel
- MainPanel.Java - 扩展 JPanel - 添加面板
- InnerPanel.Java - 扩展 JPanel - 显示 JLabel
我找到了以下添加渐变背景的代码:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
TestPanel panel = new TestPanel();
frame.add(panel);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
这在添加到 InnerPanel.java、 时有效,但在添加到 MainPanel.Java
时无效
没有错误,我只是得到默认的灰色,注意:InnerPanel.Java 设置为透明。
那么如何解决呢?我可以在主面板上添加渐变背景并在其上添加透明面板吗?
我的 4 类:
public class GuiApp {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainFrame();
}
});
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class MainFrame extends JFrame {
private MainPanel mainPanel;
public MainFrame() {
super("GuiApp");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(300, 500);
// setBackground(new Color(95, 158, 160));
setLayout(new BorderLayout());
mainPanel = new MainPanel();
add(mainPanel, BorderLayout.CENTER);
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public class MainPanel extends JPanel {
private InnerPanel panel;
public MainPanel() {
setLayout(new BorderLayout());
panel = new InnerPanel();
add(panel, BorderLayout.CENTER);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
int w = getWidth();
int h = getHeight();
Color color1 = Color.RED;
Color color2 = Color.GREEN;
GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
g2d.setPaint(gp);
g2d.fillRect(0, 0, w, h);
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public class InnerPanel extends JPanel {
public InnerPanel() {
setBackground(new Color(0, 0, 0, 0));
JLabel label = new JLabel("testing");
add(label);
}
}
所以,你的主要问题在这里:
setBackground(new Color(0, 0, 0, 0));
Swing 只知道如何绘制完全透明或完全不透明的组件,这是通过 opaque
属性 控制的。通过提供基于 alpha 的颜色,Swing 不会知道它应该绘制出现在该组件下方的组件,无论何时由于某种原因进行更新
相反,您应该使用 setOpaque
并传递它 false
InnerPanel
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class InnerPanel extends JPanel {
public InnerPanel() {
setOpaque(false);
// To prove the point
setBackground(Color.RED);
JLabel label = new JLabel("testing");
add(label);
}
}
MainPanel
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JPanel;
public class MainPanel extends JPanel {
private InnerPanel panel;
public MainPanel() {
setLayout(new BorderLayout());
panel = new InnerPanel();
add(panel, BorderLayout.CENTER);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
int w = getWidth();
int h = getHeight();
Color color1 = Color.RED;
Color color2 = Color.GREEN;
GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
g2d.setPaint(gp);
g2d.fillRect(0, 0, w, h);
}
}
GuiApp
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class GuiApp {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
其中,放在一起会生成...
我是初学者,正在尝试创建 GUI。我有 4 个基本 类(见下文):
- GuiApp.java - 使用 main 方法,调用 MainFrame class
- MainFrame.Java - 扩展 JFrame - 添加 MainPpanel
- MainPanel.Java - 扩展 JPanel - 添加面板
- InnerPanel.Java - 扩展 JPanel - 显示 JLabel
我找到了以下添加渐变背景的代码:
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame();
TestPanel panel = new TestPanel();
frame.add(panel);
frame.setSize(200, 200);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
这在添加到 InnerPanel.java、 时有效,但在添加到 MainPanel.Java
时无效没有错误,我只是得到默认的灰色,注意:InnerPanel.Java 设置为透明。
那么如何解决呢?我可以在主面板上添加渐变背景并在其上添加透明面板吗?
我的 4 类:
public class GuiApp {
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new MainFrame();
}
});
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
class MainFrame extends JFrame {
private MainPanel mainPanel;
public MainFrame() {
super("GuiApp");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setVisible(true);
setSize(300, 500);
// setBackground(new Color(95, 158, 160));
setLayout(new BorderLayout());
mainPanel = new MainPanel();
add(mainPanel, BorderLayout.CENTER);
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public class MainPanel extends JPanel {
private InnerPanel panel;
public MainPanel() {
setLayout(new BorderLayout());
panel = new InnerPanel();
add(panel, BorderLayout.CENTER);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
int w = getWidth();
int h = getHeight();
Color color1 = Color.RED;
Color color2 = Color.GREEN;
GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
g2d.setPaint(gp);
g2d.fillRect(0, 0, w, h);
}
}
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public class InnerPanel extends JPanel {
public InnerPanel() {
setBackground(new Color(0, 0, 0, 0));
JLabel label = new JLabel("testing");
add(label);
}
}
所以,你的主要问题在这里:
setBackground(new Color(0, 0, 0, 0));
Swing 只知道如何绘制完全透明或完全不透明的组件,这是通过 opaque
属性 控制的。通过提供基于 alpha 的颜色,Swing 不会知道它应该绘制出现在该组件下方的组件,无论何时由于某种原因进行更新
相反,您应该使用 setOpaque
并传递它 false
InnerPanel
import java.awt.Color;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class InnerPanel extends JPanel {
public InnerPanel() {
setOpaque(false);
// To prove the point
setBackground(Color.RED);
JLabel label = new JLabel("testing");
add(label);
}
}
MainPanel
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JPanel;
public class MainPanel extends JPanel {
private InnerPanel panel;
public MainPanel() {
setLayout(new BorderLayout());
panel = new InnerPanel();
add(panel, BorderLayout.CENTER);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
int w = getWidth();
int h = getHeight();
Color color1 = Color.RED;
Color color2 = Color.GREEN;
GradientPaint gp = new GradientPaint(0, 0, color1, 0, h, color2);
g2d.setPaint(gp);
g2d.fillRect(0, 0, w, h);
}
}
GuiApp
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class GuiApp {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new MainPanel());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
}
其中,放在一起会生成...