//MessagePanel.java
import javax.swing.*;
import java.awt.*;
public class MessagePanel extends JPanel{
private String message="Hello World";
private int x=20;
private int y=20;
private boolean centered;
public MessagePanel(){
}
public MessagePanel(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean isCentered() {
return centered;
}
public void setCentered(boolean centered) {
this.centered = centered;
}
public void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.red);
if(centered){
FontMetrics fm=g.getFontMetrics();
int w=fm.stringWidth(message);
int h=fm.getAscent();
x=(getSize().width-w)/2;
y=(getSize().height+h)/2;
}
g.drawString(message, x,y);
}
}
//TestFrame.java
import java.awt.*;
import javax.swing.*;
public class TestFrame extends JFrame {
public TestFrame() {
MessagePanel messagePanel = new MessagePanel("Hello World");
messagePanel.setFont(new Font("ScansSerif", Font.ITALIC, 20));
messagePanel.setCentered(true);
getContentPane().add(messagePanel);
} public static void main(String[] args){
TestFrame frame=new TestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setTitle("Hello");
frame.setVisible(true);
}
}
要求用红色、ScanSeri、斜体、20磅的规格居中显示信息Hello World,我运行的时候怎么字一闪而过,g.drawString(message, x,y);改成g.drawString(message, 20,20);怎么就行了,求解决,谢谢。
import javax.swing.*;
import java.awt.*;
public class MessagePanel extends JPanel{
private String message="Hello World";
private int x=20;
private int y=20;
private boolean centered;
public MessagePanel(){
}
public MessagePanel(String message){
this.message=message;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public int getX() {
return x;
}
public void setX(int x) {
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
public boolean isCentered() {
return centered;
}
public void setCentered(boolean centered) {
this.centered = centered;
}
public void paintComponent(Graphics g){
super.paintComponents(g);
g.setColor(Color.red);
if(centered){
FontMetrics fm=g.getFontMetrics();
int w=fm.stringWidth(message);
int h=fm.getAscent();
x=(getSize().width-w)/2;
y=(getSize().height+h)/2;
}
g.drawString(message, x,y);
}
}
//TestFrame.java
import java.awt.*;
import javax.swing.*;
public class TestFrame extends JFrame {
public TestFrame() {
MessagePanel messagePanel = new MessagePanel("Hello World");
messagePanel.setFont(new Font("ScansSerif", Font.ITALIC, 20));
messagePanel.setCentered(true);
getContentPane().add(messagePanel);
} public static void main(String[] args){
TestFrame frame=new TestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setTitle("Hello");
frame.setVisible(true);
}
}
要求用红色、ScanSeri、斜体、20磅的规格居中显示信息Hello World,我运行的时候怎么字一闪而过,g.drawString(message, x,y);改成g.drawString(message, 20,20);怎么就行了,求解决,谢谢。
解决方案 »
- java.util.Arrays中的一个方法,有问题呀,你们觉得呢?
- 有关类字面常量的问题。
- 我在 java扩展版提了一个关于Timer和TimerTask的问题? 求人帮忙解决
- 这个程序为何会出现两处错误提示:The constructor Date(int,int,int) is deprecated 和 The method getYear() from the type Date is de
- 菜鸟问题,如何获取二维数组的列数
- 类转换异常java.lang.ClassCastException
- 关于线程,数据库连接池问题!!!急求---------------(面临下岗呀!!!--在线等!!!!!!)
- java调用存储过程的时候没有成功啊!都一天了啊!希望大家帮忙啊
- jtree图标问题
- 请问那里有j2sdk-1_4_2的下载!
- 一个快速排序算法的实现
- 关于Java中的static的若干问题
super.paintComponents(g);
g.setColor(Color.red);
if(centered){
FontMetrics fm=g.getFontMetrics();
int w=fm.stringWidth(message);
int h=fm.getAscent();
x=(getSize().width-w)/2;
y=(getSize().height+h)/2;
g.drawString(message, 80,70);
System.out.println("x: " + x);
System.out.println("y: " + y);
System.out.println("w: " + w);
System.out.println("h: " + h);
System.out.println("width:"+getSize().width);
System.out.println("height:"+getSize().height);
}
我把你的这个类加了一些用于调试的语句
x: 89
y: 91
w: 105
h: 21
width:284
height:162
这是输出结果,我把参数改成80,70刚好在右下角落里显示。显示不了的原因,应该是你计算有问题。
this.y=(getSize().height+h)/2;这样写试试看
System.out.println("y: " + y);
System.out.println("w: " + w);
System.out.println("h: " + h);
System.out.println("width:"+getSize().width);
System.out.println("height:"+getSize().height);
怎么还是一闪而过,而且调试语句怎么输出两次?
2楼的方法好像也不行。
那么,怎么居中显示信息Hello World呢。
还有,Jpanel类对象的getSize()返回的是什么的宽和高?
import java.awt.*;
import java.awt.geom.*;
import javax.swing.*;
import java.awt.font.*;class MessagePanel extends JPanel{
private double x;
private double y;
private double basey;
private double ascent;
public void paintComponent(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
String message = new String("Hello World");
Font f = new Font("Serif", Font.BOLD, 25);
g2.setColor(Color.red);
g2.setFont(f);
//测量字体
FontRenderContext content = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, content);
x = (getWidth() - bounds.getWidth()) / 2;
y = (getHeight() - bounds.getHeight()) / 2;
ascent = -bounds.getY();
basey = y + ascent;
//打印出message
g2.drawString(message, (int)x, (int)basey);
g2.setPaint(Color.GRAY);
}
}
class TestFrame extends JFrame {
public TestFrame() {
MessagePanel messagePanel = new MessagePanel();
messagePanel.setFont(new Font("ScansSerif", Font.ITALIC, 20));
getContentPane().add(messagePanel);
}public static void main(String[] args){
TestFrame frame=new TestFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(300,200);
frame.setTitle("Hello");
frame.setVisible(true);
}}
import javax.swing.border.*;class MessagePanel extends JPanel {
private String message = "hello world";
private boolean centered;
public MessagePanel() {
setFont(new Font("ScansSerif", Font.ITALIC, 20));
}
public void setCentered(boolean centered) {
this.centered = centered;
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.RED);
if(centered == true){
FontMetrics fm=g.getFontMetrics();
int w=fm.stringWidth(message);
int h=fm.getAscent();
g.drawString(message, getWidth()/2 - w/2, getHeight()/2 + h/2);
}
}
}class MyFrame extends JFrame {
public MyFrame() {
MessagePanel panel = new MessagePanel();
panel.setCentered(true);
add(panel);
}
}
public class Test3 {
public static void main(String[] args) {
MyFrame frame = new MyFrame();
frame.setSize(300, 200);
frame.setVisible(true);
}}
2楼的方法好像也不行。
那么,怎么居中显示信息Hello World呢。
还有,Jpanel类对象的getSize()返回的是什么的宽和高?输出两次,因为这个方法调用了两次。你的程序结构不太好,我参考书上的,重新编了一个,你看看。
import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;public class FontTest
{
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
FontFrame frame = new FontFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
}/**
* 框架的构建
*/
class FontFrame extends JFrame
{
public FontFrame()
{
setTitle("Hello");
setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); // 加上框架的组件 FontComponent component = new FontComponent();
add(component);
} public static final int DEFAULT_WIDTH = 300;
public static final int DEFAULT_HEIGHT = 200;
}/**
*
*/
class FontComponent extends JComponent
{
public void paintComponent(Graphics g)
{
Graphics2D g2 = (Graphics2D) g; String message = "Hello, World!"; Font f = new Font("Serif", Font.BOLD, 36);
g2.setFont(f);
g2.setPaint(Color.RED);
// 计算信息的大小 FontRenderContext context = g2.getFontRenderContext();
Rectangle2D bounds = f.getStringBounds(message, context);//返回的是一个矩形 // 计算信息开始写的地方,即信息矩形的左上角坐标(x,baseY) double x = (getWidth() - bounds.getWidth()) / 2;
double y = (getHeight() - bounds.getHeight()) / 2;
double ascent = -bounds.getY();//计算上坡度
double baseY = y + ascent;
g2.drawString(message, (int) x, (int) baseY);
}
}