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 回答