我必须使用Swing创建一个Java程序,我想显示一些文本,但不使用JLabel(包括文本组件)!我必须扩展JFrame.我还有其他选择吗?
解决方法:
你不应该:
>不必要地扩展JFrame
>通过paint(..)直接绘制到JFrame
你应该:
>覆盖JComponents paintComponent(…)
>在paintComponent(…)中进行自定义绘制,
>将JComponent实例添加到JFrame
这是一个例子:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class DrawSimpleText {
public DrawSimpleText() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new DrawSimpleText();
}
});
}
private void initComponents() {
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.getContentPane().add(new JPanel(true) {
Font font = new Font("Serif", Font.PLAIN, 20);
String s = "Java Source and Support";
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(font);
FontMetrics fm = g.getFontMetrics(font);
int width = fm.stringWidth(s);
Dimension d = getSize();
//center String/text
int cx = (d.width - width) / 2;
int cy = (d.height - fm.getHeight()) / 2 + fm.getAscent();
g2.drawString(s, cx, cy);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 100);
}
});
f.pack();
f.setVisible(true);
}
}
更新:
根据你的评论虽然它反对所有Swing规则和我自己的道德:
但是,如果你仍然需要这样做(我无法理解为什么这只是不好的做法),这里是如何:
import java.awt.Dimension;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;
public class DrawSimpleText extends JFrame {
public DrawSimpleText() {
initComponents();
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new DrawSimpleText();
}
});
}
private void initComponents() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setVisible(true);
}
Font font = new Font("Serif", Font.PLAIN, 20);
String s = "Java Source and Support";
@Override
public void paint(Graphics g) {
super.paint(g);
Graphics2D g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setFont(font);
FontMetrics fm = g.getFontMetrics(font);
int width = fm.stringWidth(s);
Dimension d = getSize();
//center String/text
int cx = (d.width - width) / 2;
int cy = (d.height - fm.getHeight()) / 2 + fm.getAscent();
g2.drawString(s, cx, cy);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(300, 100);
}
}
标签:java,swing,jframe 来源: https://codeday.me/bug/20190625/1287811.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。