• 締切済み

文字サイズが可変のラベル

ウインドウ上に同サイズのJLabelを設置する。ラベル上には(プログラム上で書き換える、つまり固定の)文字が書かれており、その文字をウインドウサイズに応じて、サイズ変更できるようにする。この時、文字の縦横比を維持する場合と、維持せずにウインドウめいっぱいまで文字を伸張する場合の2通り作る。 という課題なのですが、できるのかどうかさえ分からない状態です。通常だと文字サイズは固定なのでウインドウを大きくすると文字は小さいままです。どうやってウインドウのサイズ変更に対応することができるのでしょうか? どうぞよろしくお願いします。

みんなの回答

  • zozy
  • ベストアンサー率60% (20/33)
回答No.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); } }

sainte
質問者

お礼

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

  • zozy
  • ベストアンサー率60% (20/33)
回答No.3

マウスホイールを回転させるとサイズがかわるものを作りました。 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); } }

sainte
質問者

補足

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

  • zozy
  • ベストアンサー率60% (20/33)
回答No.2

ソースコードに誤りがありました。 申し訳ないです。 下記のものが誤りを訂正したソースになります。 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); } }

sainte
質問者

補足

(上の補足からの続きです) これは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)

  • zozy
  • ベストアンサー率60% (20/33)
回答No.1

完全にご要望に沿うものではないですが、文字の縦横比を維持しないほうのプログラムができました。 ヒントかなにかにしてもらえると幸いです。 なお、ソースコードでわかりづらい点がございましたら、返信ください。 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); } }

sainte
質問者

補足

早速ありがとうございます しかしながら例外が発生しています 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)

関連するQ&A