Поле со списком только для чтения

У меня есть пользовательский интерфейс с кнопками, текстовыми полями и выпадающими списками. Это зависит от подключения пользователя, чтобы сделать их редактируемыми или нет. С Fields это просто:

setEditable(false);

Но comboBox для меня проблема.

Когда я использую:

setDisabled(true);
setOpacity(1.0);

Поле со списком полностью видимое, не редактируемое (редактируемое в поле со списком означает, что вы пишете свой собственный текст, для него автоматически устанавливается значение false), но текст в поле со списком отображается серым цветом.

У вас есть идея, как сделать его нередактируемым и сделать его похожим на редактируемый ComboBox. Текст по-прежнему должен быть виден.


person Fabinout    schedule 29.05.2013    source источник
comment
Почему бы вам не использовать метод setEditable ComboBox? Или я вас не понял?   -  person Software Guy    schedule 29.05.2013
comment
@SoftwareGuy Это редактируемое поле со списком: docs.oracle.com/ javase/tutorial/figures/uiswing/components/ По сути, сделать его недоступным для редактирования просто означает, что вы не можете написать свой собственный элемент в поле со списком   -  person Fabinout    schedule 29.05.2013
comment
Разве это не setRenderer ?   -  person PeterMmm    schedule 29.05.2013
comment
@PeterMmm Ну, я полагаю, setRenderer был бы великолепен, но это Swing, и я использую JavaFX. Как вы думаете, я могу смешивать два API?   -  person Fabinout    schedule 29.05.2013
comment
Я всегда думал, что Swing ошибся в этом. Единственными компонентами, которые поддерживали true setEditable() (т. е. только для чтения), были JTextComponents. Мне всегда приходилось сворачивать свой собственный для каждого другого компонента. Я надеюсь, что JavaFX принял это во внимание.   -  person splungebob    schedule 29.05.2013


Ответы (2)


Если я правильно вас понял, вы хотите, чтобы ComboBox НЕ редактировался, но по-прежнему выглядел так, как обычно, когда он доступен для редактирования. Если это так, вы можете использовать CSS в JavaFX, чтобы изменить внешний вид элементов управления.

В случае ComboBox внутри используется TextField, который также наследует CSS TextInputControl, поэтому вы можете изменить цвет и другой внешний вид текста, как описано в Справочнике по JavaFX CSS:

-fx-text-fill: black;

Источник: http://docs.oracle.com/javafx/2/api/javafx/scene/doc-files/cssref.html#textinputcontrol

ОБНОВЛЕНИЕ:

Мне удалось создать крошечный пример приложения, в котором используется CSS для установки цвета фона так же, как и в редактируемом поле со списком:

package cssstyling;

import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.control.ListCell;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class CssStyling extends Application {

    @Override
    public void start(Stage primaryStage) {
        Group root = new Group();
        Scene scene = new Scene(root, 500, 500, Color.BLACK);

        ComboBox b = new ComboBox();
        b.setButtonCell(new ListCell());
        b.getButtonCell().setStyle("-fx-background-color: white;");
        b.setLayoutX(220);
        b.setLayoutY(20);
        root.getChildren().add(b);

        primaryStage.setTitle("JavaFX Scene Graph Demo");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

}

Надеюсь, это было полезно!

person Software Guy    schedule 29.05.2013
comment
Что ж, это была отличная идея, но comboBox.setStyle("-fx-text-fill;"); не работает, как и ` clientPrefixCombo.setCellFactory(‹ListView›() { @@@ return new ListCell(){ @Override protected void updateItem(final Object o, final boolean b ) { super.updateItem(o, b); setStyle(-fx-text-fill;); } }; });` - person Fabinout; 29.05.2013
comment
Да, вы очень четко поняли, что я хотел. Но я, возможно, не совсем понял, как ты сказал мне с этим справиться. Я не нашел, как получить доступ к TextField из поля со списком. - person Fabinout; 29.05.2013
comment
к сожалению, я на работе, поэтому не могу много взломать ... но я почти уверен, что нам нужно использовать CSS. Я, возможно, попытаюсь взломать немного, когда вернусь домой. простите ;( - person Software Guy; 29.05.2013
comment
Не волнуйся, я не тороплюсь. В любом случае спасибо за ваше время. - person Fabinout; 29.05.2013
comment
@Fabinout Я разместил код. Я надеюсь, что это полезно для вас. - person Software Guy; 31.05.2013
comment
Еще раз спасибо за ваше время. Проблема в том, что в поле со списком больше не отображается выбранный элемент. Я как бы забыл объяснить эту часть проблемы... :/ - person Fabinout; 31.05.2013
comment
Пожалуйста. Да, я заметил это, но это также можно решить с помощью CSS. См. эту ссылку для справки: docs. oracle.com/javafx/2/api/javafx/scene/doc-files/, где показана иерархия. Вы должны установить CSS для всплывающего окна со списком и/или его дочерних элементов. Идея примера приложения заключалась в том, чтобы создать отправную точку для того, как играть с css. - person Software Guy; 31.05.2013

Документация CSS описывает псевдоклассы, которые может иметь Node. Сюда входит псевдокласс .disabled. Поэтому вы должны предоставить текстовое заполнение для отключенного элемента управления в его псевдоклассе .dusabled.

person scottb    schedule 29.05.2013