0

テキストとアイコンだけでなく、寸法も引数として取る新しいボタン作成クラスを作成しようとしています。それを行うために、私は JButton クラスを参照として使用し、独自のものを追加しています。問題は、追加するボタンを取得するために必要と思われる writeObject メソッドで、.setWriteObjCounter が、同じパッケージ内からのみアクセス可能であると述べていることです。誰もそれにアクセスする方法を知っていますか? (パッケージに入れる以外は出来ないので)

import javax.accessibility.Accessible;
import javax.accessibility.AccessibleContext;
import javax.accessibility.AccessibleRole;
import javax.swing.*;
import javax.swing.plaf.ButtonUI;
import java.awt.*;
import java.io.IOException;
import java.io.ObjectOutputStream;
public class JMButton extends AbstractButton implements Accessible {
  private static final String uiClassID = "JMButtonUI";
  //constructors for different inputs 
  public JMButton() {
    this(null, null, 0, 0);
  }
  public JMButton(String text) {
    this(text, null, 0, 0);
  }
  public JMButton(Icon icon) {
    this(null, icon, 0, 0);
  }
  public JMButton(String text, Icon icon) {
    this(text, icon, 0, 0);
  }
  public JMButton(String text, int width, int height) {
    this(text, null, width, height);
  }
  public JMButton(Icon icon, int width, int height) {
    this(null, icon, width, height);
  }
  public JMButton(int width, int heigth) {
    this(null, null, width, heigth);
  }
  public JMButton(Action a) {
    this();
    setAction(a);
  }
  public JMButton(String text, Icon icon, int width, int height) {
    setModel(new DefaultButtonModel());
    init(text, icon);
    if (width == 0) {
      FontMetrics fontMetrics = getFontMetrics(getFont());
      int buttonWidth = fontMetrics.stringWidth(text);
      setSize(buttonWidth + 40, 40);
    } else {
      setSize(width, height);
    }
  }
  //pulled from other button classes for functionality
  public void updateUI() {
    setUI((ButtonUI) UIManager.getUI(this));
  }
  public String getUIClassID() {
    return uiClassID;
  }
  //PROBLEM!!
  private void writeObject(ObjectOutputStream s) throws IOException {
    s.defaultWriteObject();
    if (getUIClassID().equals(uiClassID)) {
      byte count = JComponent.getWriteObjCounter(this);
      JComponent.setWriteObjCounter(this, --count);
      if (count == 0 && ui != null) {
        ui.installUI(this);
      }
    }
  }
  public AccessibleContext getAccessibleContext() {
    if (accessibleContext == null) {
      accessibleContext = new AccessibleJButton();
    }
    return accessibleContext;
  }
  protected class AccessibleJButton extends AccessibleAbstractButton {
    public AccessibleRole getAccessibleRole() {
      return AccessibleRole.PUSH_BUTTON;
    }
  }
4

1 に答える 1

0

回避策:

プロジェクトで拡張するクラスと同じパッケージ構造を作成し、それにクラスを追加します。したがって、プロジェクトにはパッケージjavax.swingがあります

package javax.swing;

import java.io.IOException;
import java.io.ObjectOutputStream;

import javax.accessibility.Accessible;

public class JMButton extends AbstractButton implements Accessible {
    private static final String uiClassID = "JMButtonUI";

    private void writeObject(ObjectOutputStream s) throws IOException {
        s.defaultWriteObject();
        if (getUIClassID().equals(uiClassID)) {
            byte count = JComponent.getWriteObjCounter(this);
            JComponent.setWriteObjCounter(this, --count);
            if (count == 0 && ui != null) {
                ui.installUI(this);
            }
        }
    }

}
于 2013-04-24T17:19:02.297 に答える