标签: jcomponent

Swing HTML drawString

我正在尝试为特定目的创建一些特殊组件,在该组件上我需要绘制一个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格式,它愚蠢地绘制字符串就像它一样.

有没有办法让这项工作?

html java swing jcomponent graphics2d

10
推荐指数
6
解决办法
8619
查看次数

10
推荐指数
1
解决办法
5449
查看次数

在JPanel和JComponent上绘画有什么好处?

所以在最近的一个回答中,有人评论过此(关于绘画):

"这可能是90%Swing程序员的某种疾病:当他们制作自己的组件时,他们总是扩展JPanel而不是JComponent.为什么?"

我仍然是编程方面的新手,所以我认为现在称自己为Swing程序员为时尚早,因为我尚未找到自己的位置.但压倒一切JPanel只是我教的方式.所以我开始找到"为什么?"的答案.评论者的问题.这些是我找到的一些答案.


背景画是主要的区别.JComponent类不绘制其背景,因此您必须在重写的paintComponent方法中绘制背景.相比之下,JPanel有一个不透明的背景,可以通过调用它的paintComponennt方法来绘制.


一些程序员喜欢扩展JPanel类,而不是扩展JComponent.JPanel旨在成为可以包含其他组件的容器,但也可以在其上绘制.只有一个区别.面板是不透明的,这意味着它负责绘制其边界内的所有像素.最简单的方法是使用背景颜色绘制面板,方法是在每个面板子类的paintComponent方法中调用super.paintComponent:


如果将opaque属性设置为true ...那么Swing绘图系统不必浪费时间尝试在组件后面进行绘制,从而提高性能.


我认为最后一句话真的解释得最好.但是,除了透明度外,还有其他有益的原因"90%的Swing程序员都有这样的疾病"延伸JPanel,而不是JComponent

java swing paint jcomponent jpanel

10
推荐指数
2
解决办法
1470
查看次数

重写getPreferredSize()会破坏LSP

我总是在这个覆盖的站点中看到建议,getPreferredSize() 而不是setPreferredSize() 像以前的这些线程中所示那样使用.

  1. 使用重写getPreferredSize()而不是对固定大小的组件使用setPreferredSize()
  2. 我应该避免在Java Swing中使用set(Preferred | Maximum | Minimum)Size方法吗?
  3. 重写setPreferredSize()和getPreferredSize()

看这个例子:

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 liskov-substitution-principle jcomponent

10
推荐指数
2
解决办法
924
查看次数

如何在Java Swing中获取面板的所有组件?

如何在Java Swing中获取面板的所有组件?

有没有像foreachC#中的方法来处理JPanel的所有子组件?

java arrays swing jcomponent jpanel

9
推荐指数
1
解决办法
1万
查看次数

画一个车轮

我有一个非常简单的问题.我正在学习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)

java swing jcomponent jpanel paintcomponent

9
推荐指数
2
解决办法
1276
查看次数

我可以在显示之前获得正确的JComponent大小吗?

何时计算JComponent的大小?在屏幕上显示之后或之前?如果我.getSize()之前发送消息.setVisible(true),它会给我正确答案吗?谢谢

java swing jcomponent

8
推荐指数
4
解决办法
2599
查看次数

在JPanel中手动定位JComponent

我想以编程方式将我的JLabel移动到JPanel中的特定位置.我试过setLocation(int x, int y),但它不起作用.我试图不使用任何布局管理器.

java swing jcomponent

7
推荐指数
1
解决办法
1万
查看次数

将JComponents与JPanel的左侧和右侧对齐

我有一个包含两个JComponents的JPanel,比如两个JButton,btnLeft和btnRight.我希望这两个按钮水平对齐,我希望btnLeft位于JPanel的左侧,而btnRight位于JPanel的右侧,两者之间留有任何空间.

我知道我可以通过添加一个水平支柱 BoxLayout中做到这一点,我必须在其中指定其间的空间量,但必须有一个更简单的方法,而不必指定其间的剩余空间.

我该怎么做呢?

java layout swing jcomponent jpanel

6
推荐指数
1
解决办法
6627
查看次数

在运行时更改字体

请问有没有另一种方法如何在运行时更改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 fonts swing jcomponent swingutilities

6
推荐指数
1
解决办法
4586
查看次数