我有一个带有可扩展按钮数量的TabPane(大约20+)。 我想要一个左边的区域将前一个文本与每个按钮保存的新文本连接起来。
所以在开始时,TextArea(可能不是最好使用的)是空白的。 然后按Tab Foo然后按其中一个按钮Bar。 textarea将填充Bar - $ 10000000000000
我正在使用StringBuilder。我是否需要让每个按钮向StringBuilder添加文本然后设置TextArea以显示该文本?我觉得这会导致每个按钮真正冗余的代码。但是,我认为这是唯一的方法,因为TextArea只能在按下特定按钮时获取文本....
import kivy
kivy.require('1.8.0') # replace with your current kivy version !
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.factory import Factory
from kivy.uix.label import Label
from kivy.uix.gridlayout import GridLayout
from kivy.uix.textinput import TextInput
class SegmentLayout(GridLayout):
def __init__(self, **kwargs):
super(SegmentLayout, self).__init__(cols=1, size_hint=(1,None), **kwargs)
self.bind(minimum_height=self.setter('height'))
label_text = '[b]CurrentHistory:[/b]\nHeader:'
label = Label(text=label_text, halign='left', size_hint=(None,None), markup=True)
label.bind(size=label.setter('texture_size'))
self.add_widget(label)
text_input = TextInput(text='Enter Text Here', size_hint=(1,None))
text_input.bind(minimum_height=text_input.setter('height'))
self.add_widget(text_input)
class MainWidget(Widget):
pass
class MyApp(App):
def build(self):
return MainWidget()
Factory.register('SegmentLayout', cls=SegmentLayout)
if __name__ == '__main__':
MyApp().run()
答案 0 :(得分:3)
重复相同代码的20多个块肯定违反了DRY原则!不要为每个按钮使用唯一的处理函数,而是返回到FXML并让它们都指向单个处理程序。您可以编写如下通用处理程序:
@FXML
public void buttonPressHandler(ActionEvent event) {
Button b = (Button) event.getSource();
fieldContent.append(b.getText());
txtReceipt.setText(fieldContent.toString());
}
编辑:
正如Fabian在原始问题的评论中提到的,TextArea已经内置了一个appendText方法,因此您可以删除StringBuilder并更改处理程序,如下所示:
@FXML
public void buttonPressHandler(ActionEvent event) {
Button b = (Button) event.getSource();
txtReceipt.appendText(b.getText());
}