9

で使用するとWindows 7 JToolBar、 はJToggleButtonラベル テキストを切り詰めることがあります。

以下のコードの例を参照してください。大文字で始まるトグル ボタンは'W'切り捨てられます。スペース (または小文字の'w') で始まるものはそうではありません。

これは の下でのみ発生しWindowsますか? 誰かがなぜこれが起こるのか説明できますか?

// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6386636

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JFrame;
import javax.swing.JToggleButton;
import javax.swing.JToolBar;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;

/////////////////////// new class

public class Truncation_Example extends JToolBar {

   private static final long serialVersionUID = 1L;

   /////////////////////// object attributes

   JToggleButton toggle_Good;
   JToggleButton toggle_Bad;

   /////////////////////// constructors

   public Truncation_Example() {
      toggle_Good = new JToggleButton(new Action_Good());
      toggle_Bad = new JToggleButton(new Action_Bad());

      this.add(toggle_Good);
      this.add(toggle_Bad);
   }

   /////////////////////// inner classes

   public class Action_Good extends AbstractAction {
      private static final long serialVersionUID = 1L;
      public Action_Good() {
         putValue(Action.NAME, " Wrap Good "); // note added space to prevent truncation
      }
      @Override
         public void actionPerformed(ActionEvent e) {
            System.out.println("Toggle: " + toggle_Good.getText());
      }
   }

   public class Action_Bad extends AbstractAction {
      private static final long serialVersionUID = 1L;
      public Action_Bad() {
         putValue(Action.NAME, "Wrap Bad"); // label will be truncated if it begins with 'W'
      }
      @Override
         public void actionPerformed(ActionEvent e) {
            System.out.println("Toggle: " + toggle_Bad.getText());
      }
   }

   /////////////////////// main

   public static void main(String[] args) {
      UIManager.put("ToggleButton.select", Color.GREEN);

      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            JFrame frame = new JFrame("Truncation_Example");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JToolBar toolBar = new Truncation_Example();
            frame.add(toolBar, BorderLayout.NORTH);
            frame.setSize(500, 400);
            frame.setVisible(true);
         }
      });
   }
}
4

1 に答える 1

1

この問題は LookAndFeel に依存します。その理由を説明しましょう...

この例では、MetalLookAndFeel がインストールされている場合 (デフォルトでインストールされています)、実際にテキストを切り捨てます。他の L&F (Basic、Windows、Nimbus、自分の L&F でも) では、この問題は発生しません。MetalLookAndFeel には、MetalButtonUI または L&F 定数に何らかのバグがあり、誤ったボタン テキスト レンダリングを強制しているようです。

サイズの計算で何が起こるかを確認するには、MetalButtonUI クラスをデバッグするだけです。とにかく、この問題の根本を見つけたとしても、あなたが何かを変えるとは思えません。

于 2012-11-01T13:06:24.400 に答える