我正在尝试为特定目的创建一些特殊组件,在该组件上我需要绘制一个HTML字符串,这是一个示例代码:
public class MyComponent extends JComponent{
public MyComponent(){
super();
}
protected void paintComponent(Graphics g){
//some drawing operations...
g.drawString("<html><u>text to render</u></html>",10,10);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,drawString方法似乎没有识别HTML格式,它愚蠢地绘制字符串就像它一样.
有没有办法让这项工作?
Component.isShowing()和之间有什么区别Component.isDisplayable()?我想用它们来决定我应该停止/启动一个Timer.
所以在最近的一个回答中,有人评论过此(关于绘画):
"这可能是90%Swing程序员的某种疾病:当他们制作自己的组件时,他们总是扩展JPanel而不是JComponent.为什么?"
我仍然是编程方面的新手,所以我认为现在称自己为Swing程序员为时尚早,因为我尚未找到自己的位置.但压倒一切JPanel只是我教的方式.所以我开始找到"为什么?"的答案.评论者的问题.这些是我找到的一些答案.
背景画是主要的区别.JComponent类不绘制其背景,因此您必须在重写的paintComponent方法中绘制背景.相比之下,JPanel有一个不透明的背景,可以通过调用它的paintComponennt方法来绘制.
一些程序员喜欢扩展JPanel类,而不是扩展JComponent.JPanel旨在成为可以包含其他组件的容器,但也可以在其上绘制.只有一个区别.面板是不透明的,这意味着它负责绘制其边界内的所有像素.最简单的方法是使用背景颜色绘制面板,方法是在每个面板子类的paintComponent方法中调用super.paintComponent:
如果将opaque属性设置为true ...那么Swing绘图系统不必浪费时间尝试在组件后面进行绘制,从而提高性能.
我认为最后一句话真的解释得最好.但是,除了透明度外,还有其他有益的原因"90%的Swing程序员都有这样的疾病"延伸JPanel,而不是JComponent?
我总是在这个覆盖的站点中看到建议,getPreferredSize() 而不是setPreferredSize() 像以前的这些线程中所示那样使用.
看这个例子:
public class MyPanel extends JPanel{
private final Dimension dim = new Dimension(500,500);
@Override
public Dimension getPreferredSize(){
return new Dimension(dim);
}
public static void main(String args[]){
JComponent component = new MyPanel();
component.setPreferredSize(new Dimension(400,400));
System.out.println(component.getPreferredSize());
}
}
Run Code Online (Sandbox Code Playgroud)
setPreferredSize()
- 设置此组件的首选大小.
getPreferredSize()
- 如果preferredSize已设置为非null值,则返回它.如果UI委托的getPreferredSize方法返回非null值,则返回该值; 否则遵从组件的布局管理器.
所以这样做显然打破了Liskov替代原则.
prefferedSize是一个绑定属性,所以当你设置它时firePropertyChange执行.所以我的问题是,当你覆盖时,getPrefferedSize()你不需要覆盖setPreferredSize(..)吗?
例:
public class MyPanel extends JPanel{
private Dimension dim = null;
@Override
public Dimension …Run Code Online (Sandbox Code Playgroud) 如何在Java Swing中获取面板的所有组件?
有没有像foreachC#中的方法来处理JPanel的所有子组件?
我有一个非常简单的问题.我正在学习Java,并获得了一个绘制汽车的任务.我在一个扩展的类中完成了这一切,并在其中JPanel进行了绘制paintComponent().
我意识到这是一个糟糕的面向对象编程,并决定尝试子类化一些部分来纠正这种情况.
我试图创建一个绘制轮子的类,但是没有成功.
从本质上讲,我希望能够做到这一点:
Main Class extends JPanel
paintComponent{
Wheel leftWheel = new Wheel(0, 50, 100);
this.add(leftWheel);
}
Run Code Online (Sandbox Code Playgroud)
这应该在该点内的点(0,50)处绘制一个轮子JPanel,并且直径为100.
但是,我不确定我应该如何控制中的位置JPanel.当我这样做时,在我窗口的顶部中心绘制轮子.这是我的轮类看起来像:
public class Wheel extends JComponent {
private int x, y, diameter;
private boolean clockwise;
Wheel(int x, int y, int size, boolean cw)
{
this.setPreferredSize(new Dimension(size, size));
this.x = x;
this.y = y;
diameter = size;
clockwise = cw;
repaint();
}
public void paintComponent(Graphics canvas)
{
super.paintComponent(canvas);
canvas.setColor(Color.gray);
canvas.fillOval(x,y,diameter,diameter);
}
}
Run Code Online (Sandbox Code Playgroud)
x和y应该是它在父窗口中出现的位置,但是,在以下代码中不是这种情况(位于扩展JFrame的父类中):
Wheel …Run Code Online (Sandbox Code Playgroud) 何时计算JComponent的大小?在屏幕上显示之后或之前?如果我.getSize()之前发送消息.setVisible(true),它会给我正确答案吗?谢谢
我想以编程方式将我的JLabel移动到JPanel中的特定位置.我试过setLocation(int x, int y),但它不起作用.我试图不使用任何布局管理器.
我有一个包含两个JComponents的JPanel,比如两个JButton,btnLeft和btnRight.我希望这两个按钮水平对齐,我希望btnLeft位于JPanel的左侧,而btnRight位于JPanel的右侧,两者之间留有任何空间.
我知道我可以通过添加一个水平支柱在 BoxLayout中做到这一点,我必须在其中指定其间的空间量,但必须有一个更简单的方法,而不必指定其间的剩余空间.
我该怎么做呢?
请问有没有另一种方法如何在运行时更改Font作为整个AWT/Swing GUI使用FontUIResource,没有任何知识/兴趣,如果有局部变量和JComponents的类型


import java.awt.*;
import java.awt.event.*;
import java.util.Locale;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import javax.swing.plaf.basic.BasicComboBoxRenderer;
public class SystemFontDisplayer extends JFrame {
private static final long serialVersionUID = 1L;
private JFrame frame = new JFrame("Nimbus UIDeafaults and Font");
private JComboBox fontsBox;
private javax.swing.Timer timer = null;
private JButton testButton = new JButton("testButton");
private JTextField testTextField = new JTextField("testTextField");
private JLabel testLabel = new JLabel("testLabel");
public SystemFontDisplayer() {
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontFamilyNames = ge.getAvailableFontFamilyNames(Locale.getDefault());
fontsBox = new …Run Code Online (Sandbox Code Playgroud) java ×10
jcomponent ×10
swing ×10
jpanel ×4
arrays ×1
fonts ×1
graphics2d ×1
html ×1
layout ×1
liskov-substitution-principle ×1
paint ×1