[英]How can I customize a JDialog with round corners, no title, and no control buttons
如何自定义带有圆角、没有标题和控制按钮的JDialog
。 像下面那个。
与生活中的大多数事情一样,这是一种错觉。
你实际上是在问三个问题......
所有的事情都相对容易做,知道你需要它们,这是另一个问题。
所以,对于前两个...
JDialog dialog = new JDialog();
dialog.setUndecorated(true);
dialog.setBackground(new Color(0, 0, 0, 0));
dialog.setModal(true);
dialog.setSize(640, 480);
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
您需要移除窗口装饰并将背景设置为透明色。 如果你运行上面的代码,你会看到,实际上什么都没有,有点吓人。 那是因为窗户没有装饰,是透明的。
下一步将需要一个自定义组件。 再次,这是一种错觉。 我们将使组件透明,但是,我们将手动填充它。
public class RoundedPane extends JPanel {
private int radius = 20;
public RoundedPane() {
setOpaque(false);
setBorder(new EmptyBorder(10, 10, 10, 10));
setLayout(new BorderLayout());
}
public void setRadius(int radius) {
this.radius = radius;
setBorder(new EmptyBorder(radius / 2, radius / 2, radius / 2, radius / 2));
revalidate();
repaint();
}
public int getRadius() {
return radius;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(getBackground());
g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getRadius(), getRadius());
g2.setColor(getForeground());
g2.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getRadius(), getRadius());
super.paintComponent(g);
}
}
所以,简单地说,这将创建一个JPanel
,使其透明( setOpaque(false)
),然后覆盖它的paintComponent
这样我们就可以绘制我们的圆形效果。
现在,如果你把它完全放在一边,你最终会得到这样的东西......
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JDialog;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JDialog dialog = new JDialog();
dialog.setUndecorated(true);
dialog.setBackground(new Color(0, 0, 0, 0));
dialog.setModal(true);
dialog.setContentPane(new RoundedPane());
dialog.setSize(640, 480);
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}
});
}
public class RoundedPane extends JPanel {
private int radius = 20;
public RoundedPane() {
setOpaque(false);
setBorder(new EmptyBorder(10, 10, 10, 10));
setLayout(new BorderLayout());
}
public void setRadius(int radius) {
this.radius = radius;
setBorder(new EmptyBorder(radius / 2, radius / 2, radius / 2, radius / 2));
revalidate();
repaint();
}
public int getRadius() {
return radius;
}
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setColor(getBackground());
g2.fillRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getRadius(), getRadius());
g2.setColor(getForeground());
g2.drawRoundRect(0, 0, getWidth() - 1, getHeight() - 1, getRadius(), getRadius());
super.paintComponent(g);
}
}
}
因此,关于上述示例的一些即时说明。
setSize
。 RoundedPane
应该根据Border
和它的内容推迟计算所需的大小,所以我们不想修改它,但由于它会给出首选大小0x0
,我自己设置了对话框的大小。 你应该依靠pack
来获得更好的效果。RoundedPane
设置为对话框的contentPane
。 这将允许您继续像往常一样直接向对话框添加内容。 您可以直接向RoundedPane
添加内容,但这也确保现有的contentPane
不会干扰我们的工作。你还应该看看:
通过这种方式,我发现这个未修饰的所有字体类型都发生了变化,我如何在整个对话框中设置字体类型。
字体由安装的外观管理。 如果您确实对字体有问题,那么您做错了什么,这是平台特定的问题(即错误)
我是新来的。 感谢 MadProgrammer 提供的代码。 我真的需要它。 但是,如何为 RoundedPane 代码的边框添加颜色? 我想为 RoundedPane 边框添加蓝色。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.