Java™ 2 SDK, Standard Edition, v 1.4 での Swing の変更点および新機能

リリース 1.4.1 および 1.4.2 に固有の変更点

このドキュメントには、すべての 1.4.* リリースに関連する情報が含まれています。1.4.1 および 1.4.2 に固有の情報については、Java 2 SDK, Standard Edition, v 1.4 からの Swing の変更点を参照してください。

主要な変更点

Swing に大きな影響を与えるような各機能については、通常、個別のドキュメントに分けて説明します。次のリンクをクリックして、それぞれのドキュメントを参照してください。

微細な変更点

各セクションに、関連するクラスのセットに対する変更点を説明します。ほとんどのセクションでは、JEditorPaneJTable など、Swing の単一コンポーネントの一部であるクラスに焦点が当てられています。各 API の変更は、Bug Database にあるレポートへのリンクと関連付けられています。このサイトで、変更の理由となったバグや RFE (機能拡張の要求) を参照することができます。このドキュメントには、各 API の変更についての次の情報も含まれています。

セクション


Box

Box が JComponent から派生するようになった

この変更に関連するバグ追跡レポート: 4304100.

従来、Box のスーパークラスは Component でした。Box は、JComponent から派生しなかったので、たとえば、ボーダーを設定したり、revalidate を発行するなどで、通常の Swing コンポーネントのように使用できませんでした。これにかぎらず、視覚的な変更やその他の同様な視覚上のプロパティーの変更でも、標準的な Swing コンポーネントは通常、repaint または revalidate を使用して変更しますが、Box はこの動作に適合しませんでした。このリリースから、Box および Box.FillerJComponent スーパークラスから派生するので、標準 Swing コンポーネントにより近い動作をします。

BoxLayout が右から左、および下から上へのコンポーネントの向きをサポートするようになった

この変更に関連するバグ追跡レポート: 4140833.

BoxLayout では、レイアウトする ContainerComponentOrientation が考慮されませんでした。ほかの AWT レイアウトマネージャーは、JDK 1.2 に ComponentOrientation 機能が追加されたときに、コンポーネントの向きを考慮するように作成されました。この機能を BoxLayout に追加すると、中東ロケールをサポートするプログラムで役に立ちます。BoxLayout は、JOptionPaneJToolBarJMenuBar などの、その他の Swing コンポーネントにも内部的に使用されます。この機能を追加することは、このようなコンポーネントが ComponentOrientation をサポートするためにも必要です。

この機能をサポートするために、定数の LINE_AXISPAGE_AXIS、および BoxLayout(Container, int) コンストラクタが BoxLayout に追加されました。

さらに、SizeRequirements 内のメソッドも変更されました。


JButton

デフォルトボタンは Windows LAF のフォーカスに従う

この変更に関連するバグ追跡レポート: 4659800.

1.4.0 で発生していたこのバグのため、デフォルトボタンは常にフォーカスに従うわけではありませんでした。これは 1.4.1 で修正されました。

強調表示される文字の新規コントロール

この変更に関連するバグ追跡レポート: 4138746.

AbstractButtonJLabel の両方を使用することで、あるアクションを実行するためにキーボードから入力する文字 (ニーモニック) を設定できます。javadoc ではこれらのメソッドについて、設定した文字が最初に出現したときに大文字小文字にとらわれず強調されると説明しています。この機能はほとんどの開発者に適合しますが、同じ文字がまた出現した場合にそれも強調表示する必要がある場合も、かなりの程度あります。たとえば、「メモ帳」内では、「a」が「名前をつけて保存 (Save As)」のアクセラレータですが、2 番目の「a」が強調される文字です。開発者には、これを指定できる方法が必要です。

この問題は、新規メソッドの AbstractButton.setDisplayedMnemonicIndex および JLabel.setDisplayedMnemonicIndex で解決できます。setMnemonic または setDisplayedMnemonic メソッドでニーモニックを指定すると、setDisplayedMnemonicIndex メソッドで、強調表示される文字を変更できます。さらに、新しい AbstractButton.getDisplayedMnemonicIndex および JLabel.getDisplayedMnemonicIndex メソッドがあります。また、drawStringUnderlineCharAt javax.swing.plaf.basic.BasicGraphicsUtils に追加されました。

AbstractButton.configurePropertiesFromAction で ACTION_COMMAND_KEY プロパティーが尊重されるようになった

この変更に関連するバグ追跡レポート: 4457940.

これまで、AbstractButtonconfigurePropertiesFromAction(Action) メソッドおよび configurePropertiesFromAction(Action, String[]) メソッドでは、ACTION_COMMAND_KEY プロパティーが尊重されませんでした。このリリースでは、この点が対処されました。そのため、次に示す AbstractButton のサブクラスで、configurePropertiesFromAction メソッドの javadoc が変更されました。


JComboBox

JComboBox への PopupMenuListener の追加

この変更に関連するバグ追跡レポート: 4287690.

コンボボックスのドロップダウンメニューがポップアップされたり、元に戻されたり、取り消されたりするときにリスナーに通知される機能のサポートを、多くの開発者が求めていました。アプリケーションでは、このようなリスナーを使用して、コンボボックスのモデルを各項目とともに生成することができました。

この機能は、Look & Feel の実装のいくつかで提供されない可能性のあるドロップダウンメニュー機能用にリスナーをサポートすることについて、なんらかの、おそらくはアカデミックな懸念があったために、初期バージョンの Swing には提供されませんでした。しかし、Java とともに出荷されるすべての Look & Feel と、ほかのすべての Look & Feel でも、コンボボックスのすべての項目を表示するためにドロップダウンメニューが使用されています。そのため、メニュー状態の変更通知を取得するために、移植性のないハックに頼る開発者もいました。

このリリースでは、PopupMenuListenerJComboBox に追加されました。基盤となる Look & Feel が項目メニューをサポートしているかぎり、このリスナーを使用して、コンボボックスのメニューが表示される前後にアクションを実行できます。この機能をサポートするには、JComboBox の以下の新規メソッドが必要です。

    public void addPopupMenuListener(PopupMenuListener l)
    public void removePopupMenuListener(PopupMenuListener l)
    public void firePopupMenuWillBecomeVisible()
    public void firePopupMenuWillBecomeInvisible()
    public void firePopupMenuCanceled()

JComboBox がリスト用のプロトタイプのセルをサポートするようになった

この変更に関連するバグ追跡レポート: 4231298.

これまで JComboBox は、表示する各項目のレンダラを構成していました。リストが大きい場合、この構成方法は時間がかかります。開発者が代わりに必要としていたのは、すべてのセルに一致するプロトタイプを指定し、そのプロトタイプだけが各セルの代わりに 1 回だけチェックされるような機能でした。このリリースでは、getPrototypeDisplayValuesetPrototypeDisplayValueJComboBox に追加されました。

JComboBox および関連クラスについての Javadoc ドキュメントが改善された

この変更に対応するバグ追跡レポートは、4394300 です。

これまで、JComboBox の public API とその UI 委譲には、その実装方法を詳細に説明した javadoc が含まれていました。ただし、時間の経過とともに機能の再考とバグの修正を経て、この javadoc は時代遅れとなりました。実装の詳細ではなくメソッドの動作を説明するように、javadoc のチェックと改訂が行われました。また、実際には非公開であるはずの「protected」メソッドやフィールドに関しては、このようなメソッドのオーバーライドや呼び出しを奨励しないように、javadoc がいくつか削除されました。

そのため、JComboBoxComboBoxModelMutableComboBoxModeljavax.swing.plaf.basic.BasicComboBoxUIjavax.swing.plaf.basic.ComboPopup、および javax.swing.plaf.basic.BasicComboPopup の javadoc が変更されました。


JFileChooser

Windows Look & Feel での JFileChooser の改善

この変更に対応するバグ追跡レポートは、4290709 です。

Swing の JFileChooser は、Windows Look & Feel に基づいた Microsoft Windows の一般的なファイルのダイアログボックスと似ていますが、多少の欠如部分があり、ご不満を頂いていました。特に、Microsoft Windows の外観ガイドには、次のような記述があります。

通常の「開く」および「名前を付けて保存」ダイアログボックスが使用できない場合は、自分で作成するダイアログボックスに次の機能を組み込んで、シェル、Windows アクセサリ、およびその他のアプリケーションと確実に一貫性を保つようにしてください。

上の箇条書きの最初の 4 項目を Swing 内で実現するには、AWT からの追加の API サポートが必要です。AWT 共通ファイルダイアログも、現在では、次の理由で受け入れ難い解決方法になりました。

新しい機能が、次の public メソッドを javax.swing.filechooser.FileSystemView クラスに追加することで実行されます。このクラスによって、File クラスの適用範囲を超えて、ファイルとディレクトリの情報が提供されます。

    public boolean isTraversable(File f)
    public String getSystemDisplayName(File f)
    public String getSystemTypeDescription
    public Icon getSystemIcon(File f)
    public boolean isParent(File folder, File file)
    public File getChild(File parent, String filename)
    public boolean isFileSystem(File f)
    public boolean isFileSystemRoot(File dir)
    public boolean isDrive(File dir)
    public boolean isFloppyDrive(File dir)
    public boolean isComputerNode(File dir)
    public File createFileSystemRoot(File f)
    public File[] getRoots()

isTraversable メソッドが javax.swing.plaf.basic.BasicFileChooserUI.BasicFileView から削除されたので、そのスーパークラスの実装が使用されます。

createListSelectionListener javax.swing.plaf.metal.MetalFileChooserUI に追加されました。

また、 javax.swing.plaf.basic.BasicDirectoryModel には、次の変更があります。

    public void intervalAdded(ListDataEvent e)
    public void intervalRemoved(ListDataEvent e)
    public void renameFile(File oldFile, File newFile)


JFileChooser 内で [Open Directory] ボタンの特徴を指定する新機能

この変更に対応するバグ追跡レポートは、4318785 です。

Look & Feel では、JFileChooser 内でディレクトリを開くために使用するボタンのテキスト、ツールヒントのテキスト、およびニーモニックを指定する機能が必要です。

この機能をサポートするために、次の定数とメソッドが plaf.basic.BasicFileChooserUI に追加されました。

    protected int directoryOpenButtonMnemonic = 0;
    protected String directoryOpenButtonText = null
    protected String directoryOpenButtonToolTipText = null
    protected boolean isDirectorySelected()
    protected void setDirectorySelected(boolean b)
    protected File getDirectory()
    protected void setDirectory(File f)

複数ファイル選択のサポート

この変更に対応するバグ追跡レポートは、4218431 です。

1.4 リリースの JFileChooser で複数のファイルを選択できるようになりました。ただし、setMultiSelectionEnabled の javadoc は 1.4.1 リリースまで更新されていません。


JInternalFrame

JInternalFrame では、長すぎるタイトルを切り詰めるようになった

この変更に対応するバグ追跡レポートは、4134077 です。

以前は、内部フレームのタイトルが長すぎる場合でも、クリップされませんでした。また、タイトルがアイコン部分の上に重ねて表示され、タイトルがクリップされたことをユーザーが視覚的に検討できませんでした。この問題を解決するために、BasicInternalFrameTitlePane.getTitle が追加されました。

Windows Look & Feel 内の JInternalFrame のタイトルがグラデーション付きで描画されるようになった

この変更に関連するバグ追跡レポート: 4389209.

これを正しく実装するには、com.sun.java.swing.plaf.windows.WindowsInternalFrameTitlePane クラスを作成する必要がありました。このクラスは javax.swing.plaf.basic.BasicInternalFrameTitlePane の拡張ですが、適切な場合にグラデーションを描画するために、ペイントルーチンがオーバーライドされています。従来のコードを再利用するもっとも適切な方法は、バックグラウンドだけをペイントする部分をペイントメソッドから分離し、WindowsInternalFrameTitlePane 内でその部分をオーバーライドすることです。paintTitleBackground メソッドが javax.swing.plaf.basic.BasicInternalFrameTitlePane に追加されました。


JTextComponent

JEditorPane 内のイメージ用のツールヒントに対する新規サポート

この変更に関連するバグ追跡レポート: 4252169.

以前のリリースでは、JEditorPane 内でイメージを描画する View である ImageView がツールヒントのテキストを表示することはできませんでした。View には、JTextComponent のために表示されるツールヒントテキストに影響を与える手段がなかったためです。今回のリリースでは、JTextComponent にツールヒントがない場合に、マウスの下のビューがツールヒントを表示するように要求されます。その View が ALT 属性のある HTML 要素に対応付けられている場合、ツールヒントのテキストは、その属性の値になります。

View がツールヒントのテキストに影響を及ぼすことができるようにするには、多数のメソッドが必要でした。getToolTipTextjavax.swing.plaf.TextUI に追加されたので、特定の位置にあるツールヒントのテキストを取得できるようになりました。これで、JTextComponentgetToolTipText メソッドは、ツールヒントが JTextComponent に設定されていないとみなし、TextUI にツールヒントを転送します。

また、getToolTipTextjavax.swing.text.View に追加されました。View.getToolTipText のデフォルトの実装では、要求が指定された位置にある View の子に転送されます。特定の位置にある子を簡単に判断できるように、getViewIndexView に追加されました。

View の実装では、getViewIndex が呼び出され、次に子の ViewgetToolTipText が呼び出されます。次に ImageView によって getToolTipText がオーバーライドされ、その AttributeSet の ALT 属性から値が返されます。

ImageView クラスが public になった

この変更に関連するバグ追跡レポート: 4233811.

パッケージの非公開クラスであった javax.swing.text.html.ImageView が公開されたので、このクラスを拡張することができるようになりました。

HyperlinkEvent の読み取り専用新規プロパティー elementOffset

この変更に関連するバグ追跡レポート: 4182124.

HTML パッケージでは、マウスがリンク上を移動したことを HyperlinkEvent および HyperlinkListener クラス経由で検出する方法が、開発者に公開されました。開発者にとっては、HyperlinkListener に通知されたときにドキュメントから情報を抽出する方法が必要な場合もあります。従来は、HyperlinkEvent が示すドキュメント内の位置を、開発者が判断する方法がありませんでした。この問題を改善するために、HyperlinkEvent(Object, EventType, URL, String, Element) コンストラクタと getSourceElement メソッドが HyperlinkEvent に追加されました。

HTMLFrameHyperlinkEvent によって HyperlinkEvent が拡張され、これはすでに getSourceElement メソッドを定義しています。現在ではスーパークラスでこのメソッドを定義するため、getSourceElement の javadoc は、HTMLFrameHyperlinkEvent から削除されました (メソッド自体は継承されている)。

HTML パーサーの変更 - 空白の報告

この変更に関連するバグ追跡レポート: 4241788.

HTML パーサー (javax.swing.text.html.parser.Parser) のセマンティクスが、NetscapeTM や Internet Explorer などのブラウザにより良く適合するように若干変更されました。API に変更はありませんが、空白の報告で多少の変更があります。例を挙げます。strict (javax.swing.text.html.parser.Parser のインスタンス変数) == false (デフォルト) の場合は、Netscape と Explorer の動作を模倣するために、インスタンス変数が使用されます。

次に、問題のあるシナリオを示します。

'<b>blah <i> <strike> foo'

これは、次のように処理される可能性があります。

'<b>blah <i><strike>foo'

同様に、

'<p><a href="xx"> <em>Using</em></a></p>'

これは、次のように処理される可能性があります。

'<p><a href="xx"><em>Using</em></a></p>'

タグがフローを分断したり末尾の空白が検出されると、インスタンス変数は true に設定されます。そのため、すべての空白が無視されます。最初に空白以外の文字があったときに、インスタンス変数は false に設定し直されます。

HTML フォームの書き込みに対するサポートが改善された

この変更に関連するバグ追跡レポート: 4200439.

J2SE™ で提供された HTML サポートでは、フォームの各要素の書き込みが正しくサポートされませんでした。この原因の大部分は、フォームのモデル化の方法にありました。ドキュメントオブジェクトのモデル (www.w3.orgDOM を参照) に一層一致させるために、フォームが内部的にモデル化される方法が変更されました。以前は、フォームのすべての属性が、子の文字要素すべての attributeSet に格納されました。このリリースから、HTML ファイル自体に一層一致するように、フォームを表す要素が作成されます。この方法により、フォームがより良くモデル化される上に、フォームを一貫して書き出せるようになります。

この変更は、厳密でないフォームの処理に依存していた開発者にとっては影響があります。たとえば、次のような無効な HTML を処理するとします。

<table>
<form>
</table>
</form>

これまでは、次のようにみなされていました。

<form>
<table>
</table>
</form>

このリリースでは、代わりに次のように処理されます。

<table>
<form>
</form>
</table>

javax.swing.text.DefaultHighlighter クラス内の静的な DefaultPainter が Final になった

この変更に関連するバグ追跡レポート: 4328938.

このリリース以前は、javax.swing.text.DefaultHighlighter の static フィールド DefaultPainter は final ではありませんでした。これには、潜在的にセキュリティー上の問題がありました。このリリースでは、これが Final になりました。

PlainDocument コンストラクタが公開された

この変更に関連するバグ追跡レポート: 4220001.

このリリース以前は、PlainDocument(AbstractDocument.Content) コンストラクタは保護されていました。つまり、このコンストラクタを使用しようとする開発者はサブクラス化する必要がありました。このコンストラクタはもともと公開する予定で作成され、このリリースで公開されました。

JEditorPane.scrollToReference メソッドが公開された

この変更に関連するバグ追跡レポート: 4304676.

JEditorPane.scrollToReference は、不適切な理由で保護されていました。このメソッドはサブクラス化しなくても役に立つことを目的に作成されており、このリリースで公開されました。

Document.getText メソッドで部分戻り値が許可されるようになった

この変更に関連するバグ追跡レポート: 4156650.

テキストドキュメントの内容に効率的にアクセスするには、DocumentgetText(int, int, Segment) メソッドを定義します。残念なことに、呼び出し側には、受け手側が要求を効率的に満たすかどうかを判断する手段がありませんでした。たとえば GapContent は、要求がドキュメントの最後に編集されたスポット (ギャップ) を超えないかぎり、要求を効率的に実装できました。内容への効率的なアクセスを促進するために、setPartialReturn および isPartialReturn メソッドが Segment に追加されました。Document.getText のセマンティクスが現在のところ保持されていますが、より効率的に使用するために、呼び出し側が segment.setPartialReturn(true) を呼び出して、いつでもドキュメントの一部を取得し直す準備をしておく必要があります。

JEditorPane で HTML のユーザー補助機能がサポートされるようになった

この変更に関連するバグ追跡レポート: 4303259.

障害を持つ方々へのユーザー補助機能 (または技術) では、Accessibility API を使用して JEditorPane の内容にプログラムでアクセスすることが要求されます。以前のリリースでの唯一のアクセスは、ハイパーリンクテキストへのアクセスでした。この API の変更によって、Accessibility API を使用してすべての HTML コンポーネントにアクセスできるようになりました。

javax.swing.text.html.HTMLEditorKit は、javax.accessibility.Accessible を実装するようになりました。

JEditorPane は、 getAccessibleContext() を実装するようになりました。

新しい AbstractDocument.replace メソッドの追加サポート

この変更に関連するバグ追跡レポート: 4458513.

RFE 4431047 の一部として、replace メソッドが AbstractDocument に追加されました。このメソッドから remove および insertString (Document を変更するためのインタフェースに定義されているメソッドはこの 2 つのみ) を呼び出すことができるように、 writeLock を呼び出すための制約が緩和されました。このため、replace メソッドは、removeinsertString をオーバーライドするだけの、古いバージョンの AbstractDocument とも互換性があります。


JOptionPane

新規 showInputDialog メソッド

この変更に関連するバグ追跡レポート: 4226644.

この前のリリースでは、デフォルトの文字列付きのテキストフィールドを含んだ単純な入力ダイアログボックスを表示しようとする場合、7 個のパラメータが必要な、複雑な JOptionPane.showInputDialog メソッドを呼び出す必要がありました。新しい 2 つの showInputDialog(Object, Object) および showInputDialog(Component, Object, Object) メソッドでは、単純な入力ダイアログボックスの作成と表示がより便利になりました。

JOptionPane で ComponentOrientation がサポートされるようになった

この変更に関連するバグ追跡レポート: 4265463.

JOptionPane では、右から左の方向のレイアウトが必要でした。この変更はバグの修正であり実際の API は必要ありませんが、JOptionPane および javax.swing.plaf.basic.BasicOptionPane のクラス仕様が更新されました。

JOptionPane でサイズ変更できないダイアログが使用されるようになった

この変更に関連するバグ追跡レポート: 4829588.

リリース 1.4.0 から、サイズ変更できないダイアログを使用するために JOptionPane が変更されました。その結果、多くの JOptionPane メソッドによって表示されるダイアログが多少変化するようになりました。最初の 2 つの変更が必要です。

余分に長いテキストを処理するときにこの変更の副作用が発生します。以前は、ダイアログのサイズは画面サイズに制限されるため、長いテキストは最後に「...」が表示されて切り詰められました。現在は、余分に長いテキストが原因で、すべてのテキストを収めるためにダイアログのサイズが画面サイズよりも長くなることがあります。バグ 4829588 を継続的に参照して、この望ましくない動作が解決されたかどうかを確認してください。

JPopupMenu

JPopupMenu およびフォーカス

このリリースから、JPopupMenu を表示すると親の JRootPane にフォーカスが移動するようになりました。この変更は、JPopupMenu でキーボードトラバーサルをサポートするために行われました (4212563)。これにより、フォーカスを失ったかどうかを検証するアプリケーションで問題が発生します。このことにより影響を受ける場合は、focusLost 通知で FocusEvent の一時的なプロパティーをチェックし、true の場合は何も行わない、とすることをお勧めします。JPopupMenu にフォーカスが移動することが望ましくない場合、現在のリリースではこの移動を無効にすることができません。リリース 1.4.1 では、フォーカスを移動するかどうかの決定は、JPopupMenu のフォーカス可能性に基づいています。詳細は、バグ 4632782 を参照してください。

JPopupMenu でキーバインドがサポートされるようになった

この変更に関連するバグ追跡レポート: 4212563.

以前は、JPopupMenu でキーバインドはサポートされませんでした。矢印キー、ニーモニック、Enter キー、および Esc キーは、JPopupMenu が JMenuJComboBox のような複合コンポーネントの一部として使用されないかぎり、JPopupMenu には作用しませんでした。

この動作は、JPopupMenu には常にフォーカスが当てられず、そのため KeyEvents を取得することができないことに原因があります。以前のリリースでは、Swing のような軽量のツールキットがフォーカスを要求し、フォーカスの変更が一時的であることを示すことは不可能でした。新しいフォーカスのアーキテクチャーによってこの問題が解決され、Swing で一時的なフォーカスの変更を要求できるようになりました。このバグを修正するには、JPopupMenu にフォーカスを取得させ、キーバインドが処理されるようにする必要がありました。フォーカスが変更されることを今まで期待していなかったコンシューマは、コードを更新して、FocusEvent の一時的なプロパティーをチェックする必要があります。

JPopupMenu.setVisible(true) がヘッドレスモードで HeadlessException をスローするようになった

この変更に関連するバグ追跡レポート: 4401222.

ヘッドレスモードが新規に導入された際、 JPopupMenu.setVisible(true) はヘッドレスモードで呼び出されると NullPointerException をスローするように実装されました。このリリースからは HeadlessException をスローするように変更され、ヘッドレスモードでは実行できない操作であることを示すようになりました。


JPanel

新規の setUI および getUI メソッド

この変更に関連するバグ追跡レポート: 4226238.

setUI/getUI メソッドは、その Look & Feel がプラグイン可能な Look & Feel (plaf) で定義される場合でも、JPanel に実装されていませんでした。たとえば、javax.swing.plaf.basic.BasicPanelUI.java を参照してください。


JTabbedPane

JTabbedPane およびフォーカス

新しいフォーカスの仕様では、表示されていないコンポーネントでのフォーカス要求は失敗します。これにより、多少の副作用が発生します。1 つの副作用として、JTabbedPane に関連付けられている ChangeListener からのフォーカス要求が失敗する可能性があります。また、コンポーネントが現在表示されていないため、以前のリリースではフォーカス要求が機能していた状況でフォーカス要求が失敗することが ChangeListener に通知されます。JTabbedPane でこの状況が発生した場合は、フォーカスを要求する前にコンポーネントを表示することをお勧めします。その他の状況では、異なる方法が必要となる場合があります。

JTabbedPane 内の新規 indexAtLocation メソッド

この変更に関連するバグ追跡レポート: 4241787.

この変更以前は、クライアントプログラムに、座標で示す位置をタブ付きペイン内の特定のタブへ変換する方法がありませんでした。このため、JTabbedPane でタブの上へメニューをポップアップさせるなどの特殊なイベント処理を実装することが困難でした。

indexAtLocation メソッドが JTabbedPane に追加されました。

JTabbedPane 内のタブへアクセスするための新規ニーモニックサポート

この変更に関連するバグ追跡レポート: 4284674.

JTabbedPane の各ペインでは、以前はニーモニックが使用できませんでした。この問題の解決のために、getDisplayedMnemonicIndexAt および setDisplayedMnemonicIndexAt が追加されました。

JTabbedPane にスローされる例外に一貫性ができた

この変更に関連するバグ追跡レポート: 4287053.

JTabbedPane クラスは、多くのメソッドを保有するコンテナであり、パラメータとして整数のインデックスをとります。これらのメソッドには、残念なことに例外のスローに一貫性がありませんでした (チェック/スローするメソッドもあれば、しないメソッドもある)。さらに、javadoc にも誤りがあり、基盤となる Vector によって実際には ArrayIndexOutOfBoundsException がスローされる場合に、IllegalParameterException がスローされると記述されていました。

0 から「タブ数 - 1」までの有効な範囲内になければならないインデックスをとるすべてのメソッドは、現在は、IndexOutOfBoundsException をスローすると記述されています (注 - 互換性をとるという理由から、基盤のコードでは引き続き ArrayIndexOutOfBoundsException がスローされる)。

ドキュメントが次のように変更されました。

    * @exception IndexOutOfBoundsException if index is out of range
    *       (index < 0 || index >= tab count)
これは、次の JTabbedPane メソッドに適用されます。
    public String getTitleAt(int index)
    public Icon getIconAt(int index)
    public Icon getDisabledIconAt(int index)
    public String getToolTipTextAt(int index)
    public Color getBackgroundAt(int index)
    public Color getForegroundAt(int index)
    public boolean isEnabledAt(int index)
    public Component getComponentAt(int index)
    public int getDisplayedMnemonicIndexAt(int index)
    public Rectangle getBoundsAt(int index)
    public void setTitleAt(int index, String title)
    public void setIconAt(int index, Icon icon)
    public void setDisabledIconAt(int index, Icon icon)
    public void setToolTipTextAt(int index, String toolTipText)
    public void setForegroundAt(int index, Color foreground)
    public void setBackgroundAt(int index, Color background)
    public void setEnabledAt(int index, boolean enabled)
    public void setComponentAt(int index, Component component)
    public void setDisplayedMnemonicIndexAt(int tabIndex, int mnemonicIndex)

同じ例外処理が、以前は何も実行しなかった次のメソッドに追加されました。

    public void setSelectedIndex(int index)
    public void remove(int index)

JTable

DefaultTableModel.moveRow の仕様が明快になった

この変更に関連するバグ追跡レポート: 4144295.

JDK 1.3 では、DefaultTableModelmoveRow メソッドが明快に説明されていませんでした。つまり、startIndex の行または endIndex の行が toIndex で終了するかどうかが、はっきり定義されていませんでした。例から類推すると、行を下方に移動するときは startIndextoIndex で終了し、行を上方へ移動するときは endIndextoIndex で終了することが明白です。

つまり、moveRow の実装にはバグがあります。移動する行が複数になると、行の移動終了の位置は不定であり、移動のあとに行が連続しないことさえあります。バグ 4144295 には、実装が仕様にある例さえも正しく実行しないとあります。実際、moveRow(1, 3, 5) の例は、次の状態でベクトルを残します。

a|C|e|B|D|f|g|h|i|j|k
新しい実装では、この操作は入力から計算できる境界間の要素の単純なローテーションであるとみなします。

以前の実装が作用しなかったため、これまでの定義を単純化する機会が与えられました。startIndex は常に toIndex に移動し、toIndex 以降のすべての要素は元のままの順序に並ぶと定義されました。この定義により、単一行の移動という、前の実装で唯一正しく作用した例と同じ操作が実行されます。

新しい実装では、endIndexstartIndex より小さい場合に例外はスローされません。その代わり、すべての行 r を移動する暗黙の規約、つまり startIndex <= r <= endIndex が満たされても、何も実行されません。

JTable への入力でフォーカスがセルに転送されるようになった

この変更に関連するバグ追跡レポート: 4274963.

Excel アプリケーションでは、ユーザーが英数字キーを押すと、フォーカスが自動的に基盤エディタに移動します。これと同じ動作を JTable 内でも実装してほしいという、200 を超える JDC 要求がありました。下位互換性を考慮するという理由からデフォルトの動作を変更することはできませんが、この要求に対処するために、このリリースで新しい surrendersFocusOnKeystroke プロパティーを追加しました。新規メソッドの setSurrendersFocusOnKeystroke および getSurrendersFocusOnKeystrok で、この機能がサポートされます。デフォルトの動作は変更されていません。

DefaultTableModel で name 引数に null も指定できるようになった

この変更に関連するバグ追跡レポート: 4474094.

これまで、DefaultTableModel.addColumn(Object) メソッドと DefaultTableModel.addColumn(Object, Vector) メソッドでは、name 引数に null を指定することはできず、IllegalArgumentException がスローされていました。コンストラクタを使用したり、フィールドを直接操作したりする方法では列名に null を設定できるため、addColumn メソッドでも null 値を指定できるように変更されました。


JTree

DefaultTreeModel で null のルートが使用できるようになった

この変更に関連するバグ追跡レポート: 4264897.

DefaultTreeModel では、null のルートノードが使用できるようになりました。以前、TreeModel の javadoc には、null のルートは有効であるが、DefaultTreeModel では許可されないと指定されていました。DefaultTreeModel では現在、null のルートが、コンストラクタ内の null のルートと同様に設定可能です。setRoot の javadoc は、この変更を反映して改訂されました。

頭文字ナビゲーションが JTree へ追加された

この変更に関連するバグ追跡レポート: 4284709.

ユーザーにとっては、JTree 内で英数字キーを使用してセルをナビゲートしたい場合がしばしば発生します。そのため、getNextMatch メソッドが JTree に追加されました。BasicTreeUI によって、キーボードでキーが入力されたときにこのメソッドを呼び出す KeyListener がインストールされます。


JList

ListDataEvent.toString で有用な情報が提供されるようになった

この変更に関連するバグ追跡レポート: 4134085.

開発者はしばしば、有用なデバッグ情報を求めて toString を使用します。ただしこれまでは、ListDataEvent toString メソッドでは、真に有用な情報が提供されませんでした。このリリースで、有用な情報を返すように変更されました。

JList で頭文字キーによるナビゲーションがサポートされるようになった

この変更に関連するバグ追跡レポート: 4284709.

ユーザーにとっては、JList 内で英数字キーを使用してセルをナビゲートしたい場合がしばしば発生します。このため、getNextMatchJList に追加されました。BasicListUI によって、選択範囲を変更するためにキーが入力されたときにこのメソッドを呼び出す KeyListener がインストールされます。

JList の項目を水平に配置できるようになった

この変更に関連するバグ追跡レポート: 4460016.

これまで JList では、次のように、セルを垂直にしかレイアウトできませんでした。

1
2
3
4

多くのユーザーが、次に示すように、リストを水平にレイアウトできる機能を求めていました。

1  3
2  4
または
1  2
3  4

この機能を実現するために、VERTICALVERTICAL_WRAP、および HORIZONTAL_WRAP という 3 つの定数が JList に追加されました。getLayoutOrientation メソッドと setLayoutOrientation メソッドも JList に追加されました。JListgetScrollableTracksViewportHeightgetScrollableTracksViewportWidthgetScrollableBlockIncrement、および getPreferredScrollableViewportSize の各メソッドについて javadoc が更新されました。同様に、javax.swing.plaf.basic.BasicListUI 内の getPreferredSize についての javadoc も更新されました。


その他

Metal の Look & Feel の 2 つのデフォルト設定が変更された

Metal の Look & Feel の 2 つのデフォルト設定が変更されました。

JColorChooser.setPreviewPanel が古いパネルを削除しない

この変更に関連するバグ追跡レポート: 4759306.

このメソッドを呼び出すと、新しいパネルが追加されますが、デフォルトの PreviewPanel が colorChooser から削除されませんでした。その結果、不要な産物を残していました。これは 1.4.2 で修正されました。

JColorChooser のデッドロックが修正されました

この変更に関連するバグ追跡レポート: 4668511.

1.4.0 で発生したこのバグによって、アプリケーション全体がハングするデッドロックが発生しました。これは 1.4.1 で修正されました。

JFrame.setDefaultCloseOperation で SecurityException がスローされるようになった

リリース 1.4.1 から、JFrame 内の setDefaultCloseOperation メソッドで SecurityException をスローできるようになりました。

Metal で Microsoft Windows のデスクトップからフォントサイズを取得できるようになった

この変更に関連するバグ追跡レポート:4419964 および 4668963

このリリースより前では、DefaultMetalTheme は Windows デスクトップのフォントサイズ情報を無視していました。リリース 1.4.1 から、DefaultMetalTheme は Windows デスクトップで指定されているフォントサイズを使用できます。これは、システムプロパティー swing.useSystemFontSettings を使用して無効にできます。このバグの一部として、Windows Look & Feel でいくつかのコンポーネントに対して誤ったフォントが取得されるバグがありましたが、これは修正されました。

ロケールの一部が Windows デスクトップのフォントサイズだけを受け付ける

この変更に関連するバグ追跡レポート: 4615396.

Microsoft Windows の WindowsLookAndFeel では、特定のロケールはデスクトップのフォントサイズだけを受け付けます。これは 1.4.1 で対処されました。

Look & Feel が無視できるプロパティーについてのドキュメント

この変更に関連するバグ追跡レポート: 4420209.

Look & Feel の実装の種類によっては、Look & Feel に影響を与える可能性がある一定のプロパティーを無視することができます。このリリースでは、ある種の Look & Feel に無視されるプロパティーを示すために、一定のメソッドについてのドキュメントが変更されました。また、UIManager のクラス仕様および javax.swing.plaf.metal パッケージのドキュメントが、Java Look & Feel をデフォルトの Look & Feel に指定するために変更されました。この変更は、ドキュメントにだけ影響します。

影響を受けるメソッドには、次のものがあります。

SwingConstants で NEXT と PREVIOUS を定義するようになった

この変更に関連するバグ追跡レポート: 4175466.

SwingConstants で、Swing 全体で使用される定数を定義します。一般的な UI 操作に、シーケンス内の次と前の項目の位置指定があります。これは、現在は SwingConstants で、NEXT および PREVIOUS の定数を定義することで指定されます。

Swing 以外のコンポーネントから Swing コンポーネントのバインドを処理する新しい方法

この変更に関連するバグ追跡レポート: 4344900.

Swing には、特定のキーストロークに関連付けられたアクションをサポートする精巧なインフラストラクチャーがあります。つまり、ユーザーがある文字を入力すると、該当するアクションが実行されます。これらのイベントの処理は、JComponent.processKeyEvent 内から引き起こされます (processKeyEventjava.awt.Component からオーバーライドされる)。これらのアクションの処理は JComponent 内で発生するため、以前は開発者にとって、フォーカスを取得している JComponent 以外のサブクラス内からバインドを処理する方法がありませんでした。このため、processKeyBindings メソッドが SwingUtilities に追加されました。

Swing コンポーネントの音声フィードバック

この変更に関連するバグ追跡レポート: 4290988.

注: サウンドパッケージにいくつかバグがあるため、デフォルトでは、サウンドは再生されません。サウンドを有効にするには、次のようにします。

    UIManager.put("AuditoryCues.playList",
        UIManager.get("AuditoryCues.allAuditoryCues"));

以前の Swing コンポーネントでは、多くのプラットフォームでのネイティブコンポーネントとして、同じ音声フィードバックが提供されませんでした。Swing の PLAF への変更セットである MALF2 は、主として、出力専用のノンスピーチオーディオユーザーのフィードバックメカニズムとしての使用を目的としています。MALF2 プロジェクトは、Swing/JFC および、基盤プラットフォームでの厳密なユーザーインタフェース統合という、Java プラットフォームの目標の視点から重要です。MALF2 プロジェクトでは、ネイティブアプリケーションと Swing/JFC アプリケーションによるユーザーの経験が、音声によるユーザーへのフィードバックに関して同一であることを保証します。

この実装は、API を BasicLookAndFeel に追加して、サウンドを再生する Action を含む ActionMap のロードをサポートすることが目的としています。これで、サウンドの再生に適切なときに、多様な BasicComponentUI の実装が Action に対して actionPerformed を呼び出します。たとえば、BasicMenuItemUI では、doClick を使用してアクションを実行します。BasicLookAndFeel が Java Sound API を使用してサウンドを再生している間に、サブクラスが代替のメソッドを使用することができます。たとえば、WindowsLookAndFeel は Windows で提供されるサウンドとの統合を図るために、Toolkit.getDefaultToolkit().getDesktopProperty() 経由で String を Runnable にマッピングします。

サウンドを含む ActionMap へは、BasicLookAndFeel.getAudioActionMap 経由でアクセスできます。getAudioActionMap が最初に呼び出されるときに、次の動作が実行されます。

  1. ロードするサウンドのリストを判断するために、デフォルトのエントリ auditoryCues.cueList (Object[]) が使用される。
  2. 配列内の各エントリが createAudioAction に渡され、サウンドの再生を行う Action を取得する。
  3. BasicLookAndFeel.createAudioAction に渡された Object が使用されて、Java Sound でロードできるデフォルトのテーブルからサウンドファイルへのパスが検索される。
  4. BasicComponentUI クラスの 1 つがサウンドの再生を希望したときは、Action 内で渡されて BasicLookAndFeel.playSound が呼び出される。
  5. Action の名前がデフォルトのエントリ AuditoryCues.playList に含まれている場合は、BasicLookAndFeel.playSoundActionactionPerformed を呼び出す。

このアーキテクチャーによって、開発者は再生するサウンドをさまざまな方法でカスタマイズできます。

それとは別に、再生するサウンドのセットをデフォルトエントリの AuditoryCues.playList 経由で操作することもできます。この Object 配列には、デフォルトのテーブル内で再生するサウンドを示すキーが含まれます。MetalLookAndFeel では、これを次のように定義します。

new Object[]  {"OptionPane.errorSound", 
          "OptionPane.informationSound",
          "OptionPane.questionSound",
          "OptionPane.warningSound" }
        
この定義は、JOptionPane がサポートするサウンドのみを有効にする効果があります。

JMenu がフォーカスの新規アーキテクチャーが作用するように更新された

この変更に関連するバグ追跡レポート: 4371580.

新しいフォーカスアーキテクチャーは、RFE 4290675 の要請で導入されました。これにより、フォーカスの一時的な変更を開発者が要求できるようになります。要求は、保護された ComponentrequestFocus(boolean) メソッドまたは requestFocusInWindow(boolean) メソッドを通じて行われます。この 2 つのメソッドは、汎用でなく Swing などの軽量ツールキットのみに対する実装用として保護されています。Swing は、さまざまなパッケージ内のコードが一時的にフォーカスを要求するという方法でアーキテクチャー化されています。つまり、すべての Swing コンポーネントの親クラスである JComponent は、 requestFocus(boolean) および requestFocusInWindow を public として公開する必要があります。

コンポーネントのツリー内で ComponentOrientation を変更する新規サポート

この変更に関連するバグ追跡レポート: 4337186.

大量の Swing コンポーネントを ComponentOrientation プロパティーに注意を払いつつ取り扱う過程で、コンポーネントの階層全体の ComponentOrientation の設定を簡単に管理できるようにする 2 つの機能が必要になります。SwingUtilities の新規メソッドである applyComponentOrientation(Component c, ComponentOrientation o) を使用すると、コンポーネントの階層全体に一貫した ComponentOrientation を設定することが簡単になります。

デスクトップ関連のプロパティーへの新規アクセス

この変更に関連するバグ追跡レポート: 4290973.

Windows Look & Feel の更新の一部として、メソッドが LookAndFeelgetDesktopPropertyValue に追加され、デスクトップ関連のプロパティーにアクセスしやすくなりました。

コンポーネントのインセットによるオフセット矩形に対する新規メソッド

このメソッドは、実際には不確定な状態をサポートするために、JProgressBar の更新の一部として追加されました。この変更に関連するバグ追跡レポート: 4290717.

新しいメソッドは、calculateInnerArea(Component, Rectangle) で、SwingUtilities に追加されました。

マウスホイールのための新規 API

この変更に関連するバグ追跡レポート: 4356268.

マウスの中央ボタンとしてスクロールホイールが付いたホイールマウスは、一般的になりつつあります。この提案では、マウスホイールを使用してスクロールさせる組み込みの Java サポートのほかに、新しいホイールイベントリスナーも提供されるので、マウスホイールの動作を開発者がカスタマイズできるようになります。

新しいクラスである MouseWheelListener と、新しいインタフェースである MouseWheelEvent が追加されました。定数の MOUSE_WHEEL_EVENT_MASKAWTEvent に追加されました。AWTEventMulticaster には、mouseWheelMovedadd、および remove の 3 つの新しいメソッドがあります。Component には、addMouseWheelListener および removeMouseWheelListener の 2 つの新しいメソッドがあります。ScrollPane にも、setWheelScrollingEnabled および isWheelScrollingEnabled の 2 つの新しいメソッドがあります。最後に、Robot には、新しい mouseWheel メソッドがあります。

JFrame、JDialog、および JApplet が processKeyEvent をオーバーライドしなくなった

この変更に関連するバグ追跡レポート: 4462408.

Swing は、JComponent にキーバインディングを登録するオプションをサポートしています。以前のリリースでは、Swing のトップレベルのコンポーネント (JFrameJDialog、および JApplet) の 1 つにフォーカスがある場合、キーバインディングを有効にするには、これらのトップレベルのコンポーネントで processKeyEvent (java.awt.Component で定義されている) をオーバーライドする必要がありました。java.awt.KeyEventPostProcessor が追加され、Swing でこれを利用することにより (RFE 4389332)、Swing のトップレベルのコンポーネントでこれらのメソッドをオーバーライドする必要はなくなりました。このリリースでは、これらのメソッドはトップレベルから削除され、継承されるようになりました。

JWindow コンストラクタのヘッドレス例外に関するドキュメント

この変更に関連するバグ追跡レポート: 4483258.

このリリースではヘッドレスモードが追加されましたが、JWindow の 2 つのコンストラクタで、HeadlessException がスローされる可能性が示されていませんでした。Window(Window, GraphicsConfiguration) および JWindow(GraphicsConfiguration) の javadoc で、この点が修正されました。

入力ベリファイアの既知のバグ

この変更に関連するバグ追跡レポート: 4532517.

一部のユーザーに問題を発生させている入力ベリファイアのバグが最近発見されました。1.4 の shouldYieldFocus メソッドでは、OptionPane をポップアップさせるなどの副作用は許可されません。

これには、次のような回避策があります。

    public boolean shouldYieldFocus(JComponent input) {
      if (verify(input)) {
        return true;
      }

      // According to the documentation, should yield focus is allowed to cause
      // side effects.  So temporarily remove the input verifier on the text
      // field.
      input.setInputVerifier(null);
      System.out.println("Removed input verifier");

      // Pop up the message dialog.
      String message = "Roll over the 'JButton1' with mouse pointer "
        + "after closing this dialog.\nIt sometimes behaves correctly "
        + "for the first time\n but repeating action brings incorrect "
        + "behaviour of button.";
      JOptionPane.showMessageDialog(null, message , "invalid value", 
        JOptionPane.WARNING_MESSAGE);
      System.out.println("Showed message.");

      // Reinstall the input verifier.
      input.setInputVerifier(this);
      System.out.println("Reinstalled input verifier");

      // Tell whomever called us that we don't want to yield focus.
      return false;
    }

     

既知のバグ

Windows とリモート表示アプリケーションを同時に実行する場合のフォーカスバグ

状況によっては、フォーカスできない重量ウィンドウを表示するとフォーカスが失われることがあります。これは、具体的には Windows のフレーバと Reflection-X などのリモート表示アプリケーションを同時に実行する場合に発生します。このバグはリリース 1.4 で報告されましたが、1.4.1 では修正されました。詳細は、バグ 4628933 を参照してください。

JRootPane

RootPaneUI の複数の新規実装

この変更に関連するバグ追跡レポート: 4338458.

javax.swing.plaf.multi 内のクラスは、複数の Look & Feel を多重化するために使用されます。このクラスは通常、聴覚情報などの追加情報を提供するための補助 Look & Feel を使用するユーザー補助機能として使用されます。現在のところ、補助 Look & Feel の使用を不安定にする RootPaneUI の複数の実装はありません。

新規クラスの javax.swing.plaf.multi.MultiRootPaneUI が追加されました。

ウィンドウ装飾を提供する Look & Feel のサポート

この変更に関連するバグ追跡レポート: 4290471.

AWT では最近、Window の装飾を取り除く API を提供しました。つまり、非装飾に設定されている場合、ウィンドウを閉じたり、移動したり、サイズを変更したりするときに、Window はどのようなウィジェットも描画もしません。その意味で、Swing では Look & Feel 機能がウィンドウの装飾を描画できるようになりました。

この機能は主として javax.swing.JRootPane でサポートされますが、javax.swing.JFrame および javax.swing.JDialog で提供されるスイッチを使用することをお勧めします。

次の変更が JRootPane に対して行われました。

    public static final int NONE;
    public static final int FRAME;
    public static final int PLAIN_DIALOG;
    public static final int INFORMATION_DIALOG;
    public static final int ERROR_DIALOG;
    public static final int COLOR_CHOOSER_DIALOG;
    public static final int FILE_CHOOSER_DIALOG;
    public static final int QUESTION_DIALOG;
    public static final int WARNING_DIALOG;

    public void setWindowDecorationStyle(int style)
    public int getWindowDecorationStyle()

すべての Look & Feel がウィンドウの装飾スタイルをサポートするわけではないので、getSupportsWindowDecorations メソッドが javax.swing.LookAndFeel に追加されて、Look & Feel がこの動作をサポートするかどうかを示す方法が提供されました。

isDefaultLookAndFeelDecorated() および setDefaultLookAndFeelDecorated メソッドが JFrame に追加されました。

また、isDefaultLookAndFeelDecorated() および setDefaultLookAndFeelDecorated メソッドが JDialog に追加されました。


JScrollBar

JScrollBar が setUI をオーバーライドするようになった

この変更に関連するバグ追跡レポート: 4213298.

JScrollBar は以前、setUI メソッドをオーバーライドしませんでした。このリリースでは、オーバーライドするように変更されました。


JScrollPane

JScrollPane の新規 MouseWheelListener のサポート

これは、マウスホイールのサポートの一部として実装されました。ここでは、JScrollPane に対する変更だけを説明します。その他の変更に関する詳細は、このセクションを参照してください。この変更に関連するバグ追跡レポート: 4356268.

isWheelScrollingEnabled および setWheelScrollingEnabled メソッドが JScrollPane に追加されました。

新しい protected 内部クラスの MouseWheelHandlerjavax.swing.plaf.basic.BasicScrollPaneUI に追加されました。この内部クラスに関連するメソッドは、mouseWheelMoved です。また、新しい createMouseWheelListener メソッドが BasicScrollPaneUI に追加されました。


RepaintManager

新規 VolatileImage のサポート

この変更に関連するバグ追跡レポート: 4363288.

Java 2D チームでは、Image のグラフィックスとスクリーン組み立て操作にハードウェア高速化を利用できる、新しい VolatileImage メカニズムを実装しました。

特に指定しないかぎり、Swing はダブルバッファーを使用して GUI コンポーネントの内容をペイントします。これは、オフスクリーンイメージへ描画して、その後そのイメージをスクリーンにコピーすることで行われます。この過程が、新しい VolatileImage サポートを利用するために変更されました。

ペイントを実行するために Swing が使用するダブルバッファーは、getOffscreenBuffer メソッドを使用して RepaintManager から取得します。VolatileImage オブジェクトには失敗条件をテストするための特殊な操作が必要なため、VolatileImage を返すこのメソッドを簡単に変更することはできませんでした。それは、このメソッドを呼び出す既存のコードが存在する可能性があり、この追加の処理が実装されていないためです。したがって、特に VolatileImage オブジェクトを返すために、getVolatileOffscreenBuffer メソッドが javax.swing.RepaintManager に追加されました。


SpringLayout

新しい SpringLayout クラス

この変更に関連するバグ追跡レポート: 4290203.

このリリースでは、新しいレイアウトマネージャー SpringLayout が導入されました。

SpringLayout の使用例については、「The Java Tutorial」の「How to Use SpringLayout」を参照してください。


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.