gpt4 book ai didi

java - 如何在更改字体大小时更改 JLabel 的大小?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:09:04 25 4
gpt4 key购买 nike

我有一个 JLabel。 JLabel的代码如下。

panelmain = new JPanel();
panelmain.setLayout(null);
panelmain.setPreferredSize(new java.awt.Dimension(800, 600));
panelmain.addComponentListener(listen);
panelmain.setBorder(null);
titlebar = new JLabel("Hello World");
titlebar.setBounds(10, 10, 100, 30);
panelmain.add(titlebar);

我的问题是,如果我更改 titlebar 的字体(即 JLabel),那么如何更改大小(已在代码中设置为 titlebar.setBounds(10, 10, 100 , 30);) titlebar?

由 Girish 编辑

我的完整代码如下。

import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JInternalFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class IFrame extends JInternalFrame {

/**
*
*/
private static final long serialVersionUID = 6526561589695424088L;

private JScrollPane jsp;

private IFListen listen;

private JPanel panelmain;

protected JPanel panel;

private String title;

private JLabel titlebar;

public IFrame()
{
this.title="";
init();
}

public IFrame(String title)
{
this.title=title;
init();
}

private void init()
{
setLayout(null);

listen=new IFListen();
panelmain=new JPanel();
panelmain.setLayout(null);
panelmain.setPreferredSize(new java.awt.Dimension(800, 600));
panelmain.addComponentListener(listen);
panelmain.setBorder(null);

titlebar=new JLabel("Hello World");
titlebar.setFont(new java.awt.Font("Monotype Corsiva", 1, 48));
panelmain.add(titlebar);

panel=new JPanel();
panel.setBorder(javax.swing.BorderFactory.createTitledBorder(title));
panel.setMinimumSize(new java.awt.Dimension(400, 400));
panel.setSize(400, 400);
panelmain.add(panel);

jsp=new JScrollPane(panelmain);
jsp.setBorder(null);

add(jsp);

this.addComponentListener(listen);
}

//INFO Custom Methods
public void setTitleFont(java.awt.Font font)
{
titlebar.setFont(font); //Here I want to change size of label.
}

//INFO Listener Class for IFrame
private class IFListen implements ComponentListener
{
//INFO Overridden Methods
@Override
public void componentResized(ComponentEvent e)
{
if(e.getSource() instanceof IFrame)
jsp.setBounds(5, 5, getWidth()-20, getHeight()-20);
else if(e.getSource()==panelmain)
{
panel.setLocation(Integer.parseInt(panelmain.getWidth()/2-panel.getWidth()/2+""), 0);
}
}

//INFO Unimplemented Methods
@Override
public void componentShown(ComponentEvent arg0) {}

@Override
public void componentHidden(ComponentEvent arg0) {}

@Override
public void componentMoved(ComponentEvent arg0) {}
}
}

我已经评论了更改字体大小的地方,我想更改 jlabel 的大小。

最佳答案

不要使用 setPreferredSize,您刚刚删除了标签用来计算它想要的大小的所有计算。

避免使用 null 布局,像素完美布局是现代 ui 设计中的一种错觉。影响组件单个尺寸的因素太多,没有一个是您可以控制的。 Swing 旨在与核心的布局管理器一起工作,丢弃这些将导致无穷无尽的问题和问题,您将花费越来越多的时间来尝试纠正

使用适当的布局。这里重要的是,没有一种布局可以满足您的所有需求。您将需要学习利用每种布局的优势(和劣势)并将它们用于您的优势。这就是通常所说的“复合布局”。看看Laying Out Components Within a Container了解更多细节和想法

Resizable label

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.GridBagLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class Test {

public static void main(String[] args) {
new Test();
}

public Test() {
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 TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}

public class TestPane extends JPanel {

private JLabel label;
private JSlider slider;

public TestPane() {
label = new JLabel("Look, no hands!");
setLayout(new BorderLayout());
JPanel panel = new JPanel(new GridBagLayout());
panel.add(label);

add(panel);

slider = new JSlider(8, 96);
add(slider, BorderLayout.SOUTH);

slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
Font font = label.getFont();
font = font.deriveFont((float)slider.getValue());
label.setFont(font);
}
});
slider.setValue(8);
}

@Override
public Dimension getPreferredSize() {
return new Dimension(400, 400);
}

}

}

JLabel 出人意料的熟练,改变字体(文本/图标)会自动导致它使布局无效并请求重绘......

关于java - 如何在更改字体大小时更改 JLabel 的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31405925/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com