dポイントプレゼントキャンペーン実施中!

ウインドウ上に同サイズのJLabelを設置する。ラベル上には(プログラム上で書き換える、つまり固定の)文字が書かれており、その文字をウインドウサイズに応じて、サイズ変更できるようにする。この時、文字の縦横比を維持する場合と、維持せずにウインドウめいっぱいまで文字を伸張する場合の2通り作る。

という課題なのですが、できるのかどうかさえ分からない状態です。通常だと文字サイズは固定なのでウインドウを大きくすると文字は小さいままです。どうやってウインドウのサイズ変更に対応することができるのでしょうか?
どうぞよろしくお願いします。

A 回答 (4件)

2文字以上にすると文字の幅がラベルの幅をオーバーしてしまうからと思われます。



文字とウィンドウの隙間が大きくなるのは、フォントサイズとウィンドウとの比が維持されてるからです。

後者のみ解決できたのでそのソースコードを張っておきます。

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class ChangeFont extends JFrame{
String str="A";
JLabel label=new JLabel(str);
int size=300;
int length=str.length()-1;
public ChangeFont(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
label.setFont(new Font("MS UI Gothic",0,size));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent evt) {
labelMouseWheelMoved(evt);
}
});
getContentPane().add(label,BorderLayout.CENTER);
pack();
}
private void labelMouseWheelMoved(MouseWheelEvent evt){
if(evt.getWheelRotation()==1){
size++;
}
if(evt.getWheelRotation()==-1){
size--;
}
if(length!=0){
this.setSize(size*length,size);
label.setSize(size*length,size);
}else{
this.setSize(size,size);
label.setSize(size,size);
}
label.setFont(new Font("MS UI Gothic",0,size));
}
public static void main(String args[]){
new ChangeFont().setVisible(true);
}
}
    • good
    • 0
この回答へのお礼

ありがとうございます
やはり文字のほうは無理だったのでしょうか?

お礼日時:2009/01/12 05:24

マウスホイールを回転させるとサイズがかわるものを作りました。



import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.MouseWheelEvent;
import java.awt.event.MouseWheelListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class ChangeFont extends JFrame{
JLabel label=new JLabel("A");
int size=300;
public ChangeFont(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
label.setFont(new Font("MS UI Gothic",0,size));
label.setHorizontalAlignment(SwingConstants.CENTER);
label.addMouseWheelListener(new MouseWheelListener() {
public void mouseWheelMoved(MouseWheelEvent evt) {
labelMouseWheelMoved(evt);
}
});
getContentPane().add(label,BorderLayout.CENTER);
pack();
}
private void labelMouseWheelMoved(MouseWheelEvent evt){
if(evt.getWheelRotation()==1){
size++;
}
if(evt.getWheelRotation()==-1){
size--;
}
this.setSize(size,size);
label.setSize(size,size);
label.setFont(new Font("MS UI Gothic",0,size));
}
public static void main(String args[]){
new ChangeFont().setVisible(true);
}
}

この回答への補足

ありがとうございます
確かにマウスホイールによって動的にサイズ変更が行われます
しかし、ウインドウサイズが大きくなるにつれて、文字とウインドウの隙間がかなり大きくなってしまっています。
また、文字数を2文字以上にすると正しく表示されません。
なぜでしょうか?

補足日時:2008/12/20 19:53
    • good
    • 0

ソースコードに誤りがありました。


申し訳ないです。
下記のものが誤りを訂正したソースになります。

import java.awt.event.ComponentEvent;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class ChangeFont extends JFrame{
JLabel label=new JLabel("A");
int fontSize=300;
public ChangeFont(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
label.setFont(new java.awt.Font("MS UI Gothic",0,fontSize));
label.setHorizontalAlignment(SwingConstants.CENTER);

label.addComponentListener(new java.awt.event.ComponentAdapter(){
public void componentResized(ComponentEvent evt){
labelComponentResized(evt);
}
});

GroupLayout layout=new GroupLayout(getContentPane());
getContentPane().setLayout(layout);

layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(label,0,300,2000));

layout.setVerticalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(label,0,300,2000));

pack();
}

private void labelComponentResized(java.awt.event.ComponentEvent evt){
fontSize=(Integer.parseInt(evt.paramString().substring(23,26))
+Integer.parseInt(evt.paramString().substring(27,30)))/2;
label.setFont(new java.awt.Font("MS UI Gothic",0,fontSize));
}

public static void main(String args[]) {
new ChangeFont().setVisible(true);
}
}

この回答への補足

(上の補足からの続きです)

これはlabelComponentResizedメソッド内を
private void labelComponentResized(java.awt.event.ComponentEvent evt)
{
    fontSize=(Integer.parseInt(evt.paramString().substring(23,26))
        +Integer.parseInt(evt.paramString().substring(28,30)))/2;
        label.setFont(new java.awt.Font("MS UI Gothic",0,fontSize));
}
と修正することで防げたのですがべつの例外も発生しています

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "9)"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at ChangeFont.labelComponentResized(ChangeFont.java:41)
    at ChangeFont.access$0(ChangeFont.java:38)
    at ChangeFont$1.componentResized(ChangeFont.java:20)
    at java.awt.Component.processComponentEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

補足日時:2008/12/15 22:04
    • good
    • 0

完全にご要望に沿うものではないですが、文字の縦横比を維持しないほうのプログラムができました。


ヒントかなにかにしてもらえると幸いです。
なお、ソースコードでわかりづらい点がございましたら、返信ください。

import java.awt.event.ComponentEvent;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingConstants;
import javax.swing.WindowConstants;
public class ChangeFont extends JFrame{
JLabel label=new JLabel("A");
int fontSize=300;
public ChangeFont(){
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
label.setFont(new java.awt.Font("MS UI Gothic",0,fontSize));
label.setHorizontalAlignment(SwingConstants.CENTER);

label.addComponentListener(new java.awt.event.ComponentAdapter(){
public void componentResized(ComponentEvent evt){
labelComponentResized(evt);
}
});

GroupLayout layout=new GroupLayout(getContentPane());
getContentPane().setLayout(layout);

layout.setHorizontalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(label,0,300,2000));

layout.setVerticalGroup(
layout.createParallelGroup(GroupLayout.Alignment.LEADING)
.addComponent(label,0,300,2000));

pack();
}

private void labelComponentResized(java.awt.event.ComponentEvent evt){
fontSize=(Integer.parseInt(evt.paramString().substring(23,26))
+Integer.parseInt(evt.paramString().substring(27,30)))/2;
label.setFont(new java.awt.Font("MS UI Gothic",0,fontSize));
}

public static void main(String args[]) {
new Frame2().setVisible(true);
}
}

この回答への補足

早速ありがとうございます
しかしながら例外が発生しています

Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: For input string: "x74"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at ChangeFont.labelComponentResized(ChangeFont.java:41)
    at ChangeFont.access$0(ChangeFont.java:38)
    at ChangeFont$1.componentResized(ChangeFont.java:20)
    at java.awt.Component.processComponentEvent(Unknown Source)
    at java.awt.Component.processEvent(Unknown Source)
    at java.awt.Container.processEvent(Unknown Source)
    at java.awt.Component.dispatchEventImpl(Unknown Source)
    at java.awt.Container.dispatchEventImpl(Unknown Source)
    at java.awt.Component.dispatchEvent(Unknown Source)
    at java.awt.EventQueue.dispatchEvent(Unknown Source)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    at java.awt.EventDispatchThread.run(Unknown Source)

補足日時:2008/12/15 22:03
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!